关于C语言基础的问题,要求解过程7

来源:百度知道 编辑:UC知道 时间:2024/05/27 17:26:41
main()
{unsigned short a=32768;
short b=a;
printf("b=%hd\n",b;)}
结果是多少为什么?

在计算机内存里,二进制表示:
unsigned 32768 是 1000000000000000
如果是 signed short, 最左边的 1 是sign bit (符号位)。1 为负,0 为正。最大的正数是 0111111111111111 = 32767。32768 = 32767 + 1 就变成了 1000000000000000。

哎C语言学过到现在已经忘的差不多了.

-32768
short的数字范围是-32768~32767
共65536个数字,即2的16次
unsigned(无符号) short的范围是0~65535
机器内用二进制保存
所以当a=32768时附值给b时机器码当有符号数读取,值就变了

结果为 -32768
这道题是在考察 short int 和 unsigned short 的范围
short int 短整型 -32768 ~ 32767
unsigned short int 无符短整型 0 ~ 65535

32768在unsigned short中还没有超出范围
但在 short int 中超出范围,
short b=a; 这句话使得32768强行赋给 short 类型的b

溢出,
溢出的值 在计算机中是循环的
所以就变成了 -32768

unsigned a=32768 是 1000000000000000 short b=a=1000000000000000
但此时b变成有符号数了,这个数变成负数了是补码的形式,真正的数值是将补码换算(除符号位不变其余各位取反再整个数+1)成负数结果会是17位的1 0000 0000 0000 0000 溢出.如果高位溢出输出0,低位溢出输出
-32768.