关于C语言中,short int 的问题。

问大家一下。

如图所示,急求详解。我的电子邮箱是
我的电子邮箱是 [email protected]

谢谢。

首先你定义的a是个占2个字节的有符号数 在计算机里是以16位2进制数存储的最高位为符号位
所以它可以表示的数范围为-32678~32767
所以对于short int a来说32767就是它的最大值

32767就是0111 1111 1111 1111它最高位是0 表示正的,
当a=32767,b=a+1时0111 1111 1111 1111+1出现了溢出的情况得到1000 0000 0000 0000即-32768 (在2进制中 -1的原码是1111 1111 1111 1111所以你就应该知道)
2进制数的-0 和0的区别就是1000 0000 0000 0000 和0000 0000 0000 0000的区别但在使用a=-0和a=0赋值的结果都是0000 0000 0000 0000 这是编译器的原因所以
对于ffff 7ffff我的猜测 它的前面的ffff应该cpu中存储“b”值的上个存储单元中的数值它默认是1111 1111 1111 1111 这个当出现计算溢出时计算机把上个存储单元的数值和b值当成计算结果给输出出来了所以就会出现ffff 7ffff 而a值是32767在-32678~32767 范围内不是溢出数据所以输出正常追问

谢谢您的解答, 问题3还是不大理解,就是④,0000000000000000(16位)为什么不会被认为是0?
⑦,1000000000000000(16位)为什么不会被认为是-0 ?0或2在short int型存储16位的时候是不是最高位的第16位为符号位,其它15位为存储绝对值部分且要全部用完?没用完的也要浪费在那?若是,浪费要怎么浪费?能否以2在short int型存储16位的时候,为例举个例子,说说它在计算机内是被存储成什么的呢?谢谢。

追答

没有为什么就是硬性规定
0000 0000 0000 0000就是+0、-0
short int型占2字节 在电脑里是16位的2进制数存储 正的不足16位前面是一堆零,负的不足前面是一堆1
最高位(第16位)就是符号位,建议你随便找本汇编语言把第一章看了,然后再不懂再去问别人基础

温馨提示:答案为网友推荐,仅供参考
第1个回答  2012-12-10
按理说,应该输出7FFF,0。因为16位二进制能表示的数范围是-32768~32767,32767是正数,前面没有符号位,所以用%X就显示为7FFF。而后者是因为32768已经溢出了,那个“进位”应被自动丢弃,所以应该显示0才对。而现在的平台大都是32位二进制int的,那些输入输出函数都用4字节操作,也没有short的输出控制符,要输出的话得用其他办法控制。当32767+1后最高位的"1"就占据了short型的符号位。输出时,由于用了32位,按规则符号位要扩展到有效数位前的所有位的,就像-1并不是11而是11111111111111111111111111111111。说白了,就是你的平台把有了溢出的16位数按32位型整数输出了。这事还与你的平台有关,我这里用VC++6.0输出则是7FFF和8000,看不到你那样的结果。但我用printf("%X,%X",a,(short)b)就得到你发上来的结果了……这说明VC++6.0就不检测short类型,而你的平台还略胜一筹!为了证实前述之言,你可把a、b都声明为char型,用同样的办法输出,相信会出现7F,FFFFFF80的结果!这说明输出函数把char型也是按4字节输出的……追问

谢谢您的解答, 问题3还是不大理解,就是④,0000000000000000(16位)为什么不会被认为是0?
⑦,1000000000000000(16位)为什么不会被认为是-0 ?0或2在short int型存储16位的时候是不是最高位的第16位为符号位,其它15位为存储绝对值部分且要全部用完?没用完的也要浪费在那?若是,浪费要怎么浪费?能否以2在short int型存储16位的时候,为例举个例子,说说它在计算机内是被存储成什么的呢?谢谢。

追答

回答追问:
④——因为输出函数不认为只有16个0,它们前面的1也起作用了,且按32位输出时函数要把前面的符号们扩展到32位,这才出现了FFFF8000的情况。
⑦——很早以前的技术书籍把1000000000000000认为是-0,后来统一到它只表示-32768,0不再有正负之分,全用0表示。如果它表示了-0,由于-0、+0都是0,而-32768却没有编码表示了反而带来了麻烦。在计算机语言中,个别特殊“数”的编码只是些规定。以后还会遇到浮点数的什么系列化数非系列化数也有一些规定……你的问题可归结为:现在的平台如果不强制为short的话,输出函数就把short当int输出了;而你的平台即是不强制也兼顾了shor的符号规定,这与编译器有关!

第2个回答  2012-12-12
其实0和-0的表示都是0000000000000000(16)。正0就不说了,-0的反码为1111111111111111(16),它的补码就是10000000000000000(17),由于short型为16位,最高位去掉还是0000000000000000(16),跟+0没啥区别。而1000000000000000(16)根据补码原则算出源码,那它就不可能是-0了。至于你说的浪费问题,一个数据占多少位,在定义的时候就已经确定,如short,就是16位。(2在内存中就是00000000000000000000000000000010(32位机)),你会说前面的0都是浪费么?保不齐哪次你想这个变量存的数更大,如果当初只为2分配了2位的数据。那你是不是会当初只分配了2位而难堪呢?也许你说动态分配更好,要多少,分配多少。这却是挺好,充分利用内存。。但付出的代价就是没有一个标准,实现特别困难。计算机一般都以一字节为基准,这说明位数上的浪费是可以接受的。你的问题,上位仁兄都已经说的很明白了。再就是你在32位机上输出的结果用%x打印的时候,输出的是32位数,所以16位的符号位也会被算在里面,并且编译器会自动根据符号位对其他空位进行向上填充(ffff8000就是这么来的)。
相似回答