#define _CRT_SECURE_NO_WARNINGS 1
#include<windows.h>
#include<stdio.h>
int main()
{
short num = 32767;
short int a = num + 1;
printf("%d %u\n",a,a);
system("pause");
return 0;
}
%d为有符号输出,%u为无符号输出,它们所占有的字段长度不同,32767+1以后,会导致溢出,所以结果不同
我看了答案两个a分别是以 1000 0000 0000 0000 和 1111 1111 1111 1111 1000 0000 0000 0000输出的,明显%d输出没有整形提升,%u输出时整形提升了,这是为什么?
short 占2个字节,默认为有符号数。
范围 ˉ32768~32767
最高位解释为符号位
当以无符号数定义的时候
范围0~65535
最高位被解释为正常位-和低15位一样
比如 你定义了
unsigned short a=65535;
short b=-1;
这两个二进制是一样的
所以你在输出的时候 printf输出的格式是以二进制为准~ a b其实真正运用的时候是一样的 就看你用代码怎么解释变量值
有符号数和无符号数占用的内存空间是一样的, 只是输出的解释不同, short num = 32767; 已达到的有符号数的最大, 如果再加1 就变为负0, 表示为负数的最小值, 如果是无符号, 因为还没达到这个类型的最大值, 因此为 32768,
%d为有符号输出,%u为无符号输出
从二进制的角度上说,有符号int就是以最高位为符号位(计算机二进制是没有正负号的,只有0和1,因此最高位为0表示正整数或0,最高位为1表示负整数),使用补码的形式保存负数,而无符号int不用考虑符号的问题,它的二进制最高位仍是有效数位而不是符号位,对于short来说,有符号是-32768~32767,无符号范围0~65535. 所有对于有符号来说32767+1后,溢出,为1000 0000 0000 0000。 而%u是输入输出格式说明符,表示按unsigned int格式输入或输出数据, 所以打印的指就会变为1111 1111 1111 1111 1000 0000 0000 0000。