黄冈市环境监测站站长:有符号的基本类型的取值范围是-32768~32767即-2的15次方~2的15次方减1。。我不明白为什么要减去1。

来源:百度文库 编辑:查人人中国名人网 时间:2024/04/29 15:42:03

从最简单的问题说起吧.

最简单的一位(1bit)二进制,表示无符号数的话,只有0和1.没办法表示有符号数(只能表示两个数,你不能不表示0吧).

如果是两位(两bit)二进制,表示无符号数的话,就可以有0/1/2/3.

表示无符号数的话,就要拿第一位来做符号标示,比如0代表正数,1代表负数,这样就可以表示四个有符号数.就像下面这样:

00 ---- 0
01 ---- +1

11 ---- -1

你也许会问了,10哪去了?好,00已经代表0了,那10怎么办,你不能叫它负0吧?估计有符号数的创始人为了不浪费,将10定义为-2,于是:

00 ---- 0
01 ---- +1
10 ---- -2
11 ---- -1

明白了吗?2位(2bit)二进制能表示的有符号数是+1/0/-1/-2,不管位数怎么增加,10是-1这点是不会改变了(否则可能引起全世界的程序出错/电脑死机/硬件罢工...等等一系列问题)所以正数始终比负数少1个.

于是乎到了两字节(16bit)二进制,能表示的有符号数就是-32768~32767了,明白了吗?

在C中,用高位置1来表示负数,int型占两个字节共16位,32768的二进制是10000000,00000000,高位为1,系统会认为是负数,所以32768需要用长型表示,占四个字节。最高位就不是1了。(00000000,00000000,10000000,00000000)
-32768在内存中的表示是10000000,00000000。过程是:先读入正值32768(10000000,00000000),再取反(01111111,11111111),再加1(10000000,00000000)

你应该知道原码、补码和反码的意思吧,拿单字节来举例:

有符号的整数才有原码、反码和补码,其他的类型一概没有。对于一个字节的整数,1个字节它不管怎么样还是只能表示256个数,因为有符号所以我们就把它表示成范围:-128~127。它在计算机中是怎么储存的呢?可以这样理解,用最高位表示符号位,如果是0表示正数,如果是1表示负数,剩下的7位用来储存数的绝对值的话,能表示27个数的绝对值,再考虑正负两种情况,27*2还是256个数。首先定义0在计算机中储存为00000000,对于正数我们依然可以像无符号数那样换算,从00000001到01111111依次表示1到127。那么这些数对应的二进制码就是这些数的原码。到这里很多人就会想,那负数是不是从10000001到11111111依次表示-1到-127,那你发现没有,如果这样的话那么一共就只有255个数了,因为10000000的情况没有考虑在内。实际上,10000000在计算机中表示最小的负整数,就是这里的-128,而且实际上并不是从10000001到11111111依次表示-1到-127,而是刚好相反的,从10000001到11111111依次表示-127到-1。负整数在计算机中是以补码形式储存的,补码是怎么样表示的呢,这里还要引入另一个概念——反码,所谓反码就是把负数的原码(负数的原码和和它的绝对值所对应的原码相同,简单的说就是绝对值相同的数原码相同)各个位按位取反,是1就换成0,是0就换成1,如-1的原码是00000001,和1的原码相同,那么-1的反码就是11111110,而补码就是在反码的基础上加1,即-1的补码是11111110+1=11111111,因此我们可以算出-1在计算机中是按11111111储存的。总结一下,计算机储存有符号的整数时,是用该整数的补码进行储存的,0的原码、补码都是0,正数的原码、补码可以特殊理解为相同,负数的补码是它的反码加1。

Short Int 是用两个字节来存储数据的,道理同上。

3楼和2楼都是正解,不过2楼讲的太深奥了,难懂.还是3楼讲的简洁明了,看得人巨爽啊,我计算机老师就是像2楼哪位大哥样教我,搞得我这辈子都不想学编程.....

PS:btok大哥你改什么改,顺序一变,害得我被人家说成神经病...