关于C语言中有符号的整数值范围为什么是从-32768~32767

2024-12-01 01:01:11
推荐回答(5个)
回答1:

这是一种过时的说法了,只有在比较古老的书上才可以看到。

对于有符号整型,也就是int型,是和编译器的字长有关的,只有在16位编译器上,int类型占2个字节,其表示范围才是-32768~32767; 对于32位和64位编译器,int类型占4字节,表示范围为-2147483648~2147483647。
以16位编译器为例,介绍其原理,对于32位和64位类似。
int为有符号整型数,在16位编译器上占2字节16位。
对于有符号数,计算机中表达时,最高位约定为符号位,当符号位为0时为正数,符号位为1时为负数。
所以真正表达值的部分是剩余的15位,这15位的范围就是二进制的000 0000 0000 0000到111 1111 1111 1111。
转换成十进制也就是0~32767。
所以,正数的表示范围就是1~32767.
其中有一个特殊的值,就是0值,对于符号位1和0的时候,值都是0,用两个形式表示同一个数无疑是浪费的,符号位为1时的全0,就用来表达-32768了,这也是负数表示的范围比正数多1的原因。

综上,对于任意位的,无论是8位,16位,32位甚至64位的整数类型表示范围的计算公式为:
如总位数为n位,那么有符号数的范围为
-2^(n-1) ~ 2^(n-1)-1
无符号数的表示范围为:
0~2^n-1
在这个公式中,^表示乘方。2^n就是2的n次幂。

回答2:

首先:计算机中数值是用2进制表示的,也就是0 和1 计算机有16位和32位之分,但是现在普遍都是32位的了
其次:在计算机中数值都是用补码表示的,一个正数的补码是他本身,而负数的补码就是按位取反加1 例如-10在2进制中的表示方法为:先求10的原码1010 对1010取反为0000 0000 0000 0101(整数为2字节也就是16位)然后加1 即1111 1111 1111 0110 我们现在来10 和-10在计算机中表示的对比:
10补码/原码:0000 0000 0000 1010
-10的补码: 1111 1111 1111 0110
所以可以看出最左边的一位也就是最高位代表这个数是正还是负 0就是正1就是付
我刚才说在32位机中int型是两个字节也就是16位,那么最小的负数是几?是1000 0000 0000 0000 我说了最高位的代表正负 是不 所以这个数是-2^15 那么最大的正数怎么表示?0111 1111 1111 1111 这个数表示成2^15 ,可是这中间有一个0000 0000 0000 0000 得把他抠出去。也就是2^15 -1

回答3:

其他人都说得很详细了 我就说一点1000000000000001才是-32767
1111111111111111头位是符号位,这应是-1

回答4:

-2^15~(2^15-1)
计算机中数字是以补码存储的
主要原因:使用补码,可以将符号位和其它位统一处理;同时,减法也可按加法来处理。另外,两个用补
码表示的数相加时,如果最高位(符号位)有进位,则进位被舍弃。

在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)

回答5:

1000 0000 0000 0000
表示-32768
0000 0000 0000 0000表示0