问题
编译运行环境
Visual C++ 6.0 ,Windows 10
测试代码
#include <stdio.h>
int main()
{
short si = -32768;
unsigned short usi = si;
int i = si;
unsigned int ui = usi;
//int a = 15;
printf("变量类型 \t\t占用字节\n");
printf("short\t\t\t%lu \n", sizeof(short));
printf("unsigned short\t\t%lu \n", sizeof(unsigned short));
printf("int \t\t\t%lu \n", sizeof(int));
printf("unsigned int\t\t%lu \n", sizeof(unsigned int));
printf("\n\n");
printf("变量\t真值\t\t十六进制值\n");
printf("si\t%d\t\t%x\n",si,si);
printf("usi\t%d\t\t%x\n",usi,usi);
printf("i\t%d\t\t%x\n",i,i);
printf("ui\t%d\t\t%x\n",ui,ui);
//printf("a\t%x\t\t%x\n",a,a);
return 0;
}
结果
结果分析
1、首先程序是32位的Windows程序,所以我们先打印出对应的基本数据类型所占的字节。可以看到short为2字节(16位),int为4字节(32位)。
2、然后si的真值为-32768 对应的机器数补码为1000 0000 0000 0000B即8000H,%x的意思是把数据进行16进制的输出(32位格式)。所以我们看到最后的结果是ffff8000,这里的输出结果进行了数位扩展(符号扩展,原值没有进行扩展)的操作:
1000 0000 0000 0000
扩展后的值为
1111 1111 1111 1111 1000 0000 0000 0000
打印出来就是ffff8000H。3、usi直接接收了si的机器值1000 0000 0000 0000B,unsigned short 没有符号位,所以打印的值位32768。16进制值就是8000,省略了前面的4个0。
4、i的类型为int,是4个字节,接收si的机器值1000 0000 0000 0000B后直接进行符号扩展的操作,然后机器数的值为:1111 1111 1111 1111 1000 0000 0000 0000B ,对应16进制为ffff8000H,真值为-32768。
5、经过上面的一番分析后,ui就比较简单了,ui的机器数的值为:0000 0000 0000 0000 1000 0000 0000 0000B ,对应16进制的值为8000H,真值为32768。