|
以下是我在vs 2005上的测试代码。
#include
using namespace std;
void main()
{
int i = -2;
unsigned int j = 1;
cout << i + j; // C语言是静态类型语言,所以变量的类型在编译时就可以确定。在便是时编译器会自动把i的类型变为 unsigned int(原来类型是int)
}
最后输出结果是 4294967295
以下是生成的汇编代码。(不知道vs2005上生成的汇编,是否就是实际的机器指令?)
#include
using namespace std;
void main()
{
00411390 push ebp
00411391 mov ebp,esp
00411393 sub esp,0D8h
00411399 push ebx
0041139A push esi
0041139B push edi
0041139C lea edi,[ebp-0D8h]
004113A2 mov ecx,36h
004113A7 mov eax,0CCCCCCCCh
004113AC rep stos dword ptr es:[edi]
int i = -2;
004113AE mov dword ptr ,0FFFFFFFEh // 确实把-2存到 寄存器了,这里使用的是补码
unsigned int j = 1;
004113B5 mov dword ptr [j],1 // 这个不知道是什么码,应该也是采用补码吧
cout << i + j;
004113BC mov eax,dword ptr
004113BF add eax,dword ptr [j] // 这里做加法了
004113C2 mov esi,esp
004113C4 push eax
004113C5 mov ecx,dword ptr [__imp_std::cout (41828Ch)]
004113CB call dword ptr [__imp_std::basic_ostream >::operator<< (418290h)]
004113D1 cmp esi,esp
004113D3 call @ILT+305(__RTC_CheckEsp) (411136h)
}
004113D8 xor eax,eax
004113DA pop edi
004113DB pop esi
004113DC pop ebx
004113DD add esp,0D8h
004113E3 cmp ebp,esp
004113E5 call @ILT+305(__RTC_CheckEsp) (411136h)
004113EA mov esp,ebp
004113EC pop ebp
004113ED ret
最后的值是 11111111 11111111 11111111 11111111
为什么输出不是-1,而是4294967295,从汇编指令好像也看不出什么啊?
有牛人可以从这汇编代码看出些东西吗? |
|