有如下程序段:
#include <stdio.h> int main() { char ch = -1; printf(" %02x, %02x", ch, (unsigned char)ch); return 0; }
则输出:
//科普1:
//1Byte=8bit ,即8位!
//unsigned char 为 8 bit,所以发生-1的二进制1111111111...(32个只保留后8位)
//----------------------------------------------------------------------------
//科普2:%02XX 表示以十六进制形式输出
//02 表示不足两位,前面补0输出;出过两位,不影响
//举例:
printf("%02X", 0x123); //打印出:123
printf("%02X", 0x1); //打印出:01
对应的反汇编代码如下: char ch = -1; 003113DE mov byte ptr [ch],0FFh printf("%02x, %02x", ch, (unsigned char)ch); ;参数从右向左入栈 003113E2 movzx eax,byte ptr [ch] ;movzx是指“0”扩展,对应(unsigned char)ch 003113E6 mov esi,esp 003113E8 push eax 003113E9 movsx ecx,byte ptr [ch] ;movsx是指“符号扩展”,对应ch 003113ED push ecx 003113EE push 3158B8h 003113F3 call dword ptr ds:[319118h] 003113F9 add esp,0Ch 003113FC cmp esi,esp 003113FE call __RTC_CheckEsp (031113Bh)