谁能给我解释一下这个C语言题目啊??short int a32769coutaendlsystem(pause)return 0输出结果
谁能给我解释一下这个C语言题目啊??
short int a=32769;
cout<<a<<endl;
system("pause");
return 0;
输出结果为什么是-32767????麻烦稍微详细点啊,,,感谢!!
[解决办法]short int的范围是[-32768---32767]
[解决办法]楼上正解,超过了short类型的表示范围了。
[解决办法]有符号数溢出 结果不可靠
[解决办法]正如楼上所说,short int的范围是[-32768,32767],当超出范围时,会产生环绕现象。另外,你可以把32769转换成二进制是1000000000000001,而在计算机中任何数都是以补码形式存储的,当最高位是1时,计算机把它理解为负数,所以1000000000000001是一个负数的补码,将其转换成原码(除最高符号位外,其他各位取反再加1)得11111111111111111,这个二进制表示的十进制数就是-32767.
究其原因在于short int在您的系统中是用2个字节存储的(即16位),32769超出了short int所能存储的数的范围(即用16位已经存储不下了),而计算机并不知道,它只是忠实地按它的方式将16位的值翻译成了-32767.
解决这一问题的办法就是用更多的存储空间来存储这一数值,如将其声明为long类型或unsigned short int类型,亦或是int(如果您的计算机中int的存储空间比short int的存储空间更大)。
[解决办法]++
[解决办法]楼4说的有问题,负数原码->反码是除符号位外,各位取反加1,负数反码->原码,取符号位外减1,再取反
1:32769转换成机器码后为1000 0000 0000 0001
2:unsigned int 占2个字节 16bit
3:输出时16为1即为负数,1000 0000 0000 0001由补码转换成原码即减1成1000 0000 0000 0000,再求反即
1111 1111 1111 1111 故为-32767
[解决办法]负数原码->补码是除符号位外,各位取反加1,负数补码->原码
[解决办法]对6楼的说法做个澄清:
1:负数补码转换成原码可以用我所说的方法:除最高位(符号位)外,其它各位取反再加1;
2:unsigned short int与short int同样用2个字节存储,但前者把最高位也看成是数值本身,所以可以存储32769这一数值;
3:按我的方法将32769的机器码1000 0000 0000 0001转换成原码即是1111 1111 1111 1111,用十进制表示就是-32767.
[解决办法]对于负数补码转换成原码,6楼说的是一种方法,我说的是另一种方法。都可以成功转换。
[解决办法]short表示范围太小,溢出了。
[解决办法]你赋的值,超出了int型所能表示的范围了