unsigned short A = 10; printf("~A = %u\n", ~A); char c = 128; printf("c=%d\n", c);
输出多少?
关于符号扩展
一、短数据类型扩展为长数据类型
1、要扩展的短数据类型为有符号数的
进行符号扩展,即短数据类型的符号位填充到长数据类型的高字节位(即比短数据类型多出的那一部分),保证扩展后的数值大小不变
如1:char x=10001001b; short y=x; 则 y 的值应为 11111111 10001001b ;
2 : char x=00001001b; short y=x; 则 y 的值应为 00000000 00001001b ;
2、要扩展的短数据类型为无符号数的
进行零扩展,即用零来填充长数据类型的高字节位
如1:unsigned char x=10001001b; short y=x; 则 y 的值应为 00000000 10001001b ;
能过上面的定义可以看出在C++中,如果把一个char向一个整形转换的时候,就会存在着这个问题
如果你想得到一个正数,那么如果一个字符的ASCII码值是小于零的,而直接用(int)c进行强制类型转换,结果是通过符号扩展得到的也为一个负数。要得到正数,一定要用(int)(unsigned char)c;因为unsigned char去除了c的符号位,所以,这样的类型转换后,再用(int)进行转换得到的就是一个正数。
0040148C | mov byte ptr ss:[esp+1D],80 | 00401491 | movsx eax,byte ptr ss:[esp+1D] | 00401496 | mov dword ptr ss:[esp+4],eax | 0040149A | mov dword ptr ss:[esp],01.40506D | [esp]:"~A = %u\n", 40506D:"c=%d\n" 004014A1 | call <JMP.&printf> |
第二个,c=0x10,输出的是int,最高位为1,是负数,所以它的值就是0x00的补码就是128,所以输出-128。这两道题都是在考察二进制向int或uint转换时的最高位处理。