为什么unsigned int a=32768;;

为什么unsigned int a=32768;;

unsigned a 默认为unsigned int a 范围为 65535因此 你的溢出了 所以变成了 -32768 如果你把声明修改为signed int a 就会正确输出32768 VC之所以显示正确是因为它是32位编译器,int为4个字节,而 TC是一个16位编译器,int只有2个字节。 ----------------- 此题是考整数的存储方式--二进制补码,你只要熟悉这,应该不难。 unsigned a=32768; 这是一个无符号格式存储的数, 32768=(1000 0000 0000 0000)2 而后面把它以%d格式(即十进制有符号)输出,此时它以负数形式输出。 而当把它当成是有符号时,此时(1000 0000 0000 0000)2是一个负数的补码,(有的书上称这为输出转换) 这就涉及负数的补码怎么求? 用负数的绝对值-> 原码-> 取反得到反码--> 再加1--> 补码, 所以由补码求原来的负数是上面的逆过程 (1000 0000 0000 0000)2--> 减1 (0111 1111 1111 1111)2 取反 (1000 0000 0000 0000)22 得到绝对值的原码,即为32768,所以输出转换为-32768