中易网

c语言中基本整型int占据两个字节,取值范围-2^15--2^15-1(-32768--32767)?就是-2^15是怎么得来的?

答案:2  悬赏:0  
解决时间 2021-01-13 09:44
  • 提问者网友:皆是孤独
  • 2021-01-12 09:57
c语言中基本整型int占据两个字节,取值范围-2^15--2^15-1(-32768--32767)?就是-2^15是怎么得来的?
最佳答案
  • 二级知识专家网友:低音帝王
  • 2021-01-12 10:45
在内存中,正数的原码和补码是一样的,而负数的补码为其绝对值的原码按位取反后加1.

对于补码是0000000000000000时,对应的值为0

补码范围是0000000000000001-0111111111111111,对应的值为全部正整数,即1-2^15-1.

补码范围是1000000000000001-1111111111111111,对应的原码是100000000000001-111111111111111,值的范围是-1~-(2^15-1)。

还有一个数是100000000000000,它不能使用补码计算公式进行计算的。是计算机内部直接用它来表示-2^15追问0111 1111 1111 1111求出来是2^15-1,是最大的取值,能否在此二进制码中的0换为1,编程负的最小值,然后按照求解补码,取反加1来得出其范围中的最小值?追答不明白你的意思。
或者你看看这个:
计算机中采用二进制补码存储数据,即正数编码不变,从0000000000000000到
0111111111111111依旧表示0到32767,而负数需要把除符号位以后的部分取反加1,即-32767的补码为1000000000000001。
到此,再来看原码的正0和负0:0000000000000000和1000000000000000,补码表示中,前者的补码还是0000000000000000,后者经过非符号位取反加1后,同样变成了
0000000000000000,也就是正0和负0在补码系统中的编码是一样的。但是,我们知道,16位二进制数可以表示216个编码,而在补码中零的编码只有一个,也就是补码中会比原码多一个编码出来,这个编码就是1000000000000000,因为任何一个原码都不可能在转成补码时变成1000000000000000。所以,人为规定1000000000000000这个补码编码为-32768。 所以,补码系统中,范围是-32768~32767。
因此,实际上,二进制的最小数确实是1111111111111111,只是二进制补码的最小值才是1000000000000000,而补码的1111111111111111是二进制值的-1。追问说白了也就是我不懂-2^15是怎么来的?追答0000 0000 0000 0000~0111 1111 1111 1111=0~32767,这是正数方面的。
0000 0000 0000 0000~1000 0000 0000 0000=0~-32768,因为在补码中零的编码只有一个,也就是补码中会比原码多一个编码出来,这个编码就是1000 0000 0000 0000,因为任何一个原码都不可能在转成补码时变成1000 0000 0000 0000。所以,人为规定1000 0000 0000 0000这个补码编码为-32768=-2^15。
全部回答
  • 1楼网友:山河有幸埋战骨
  • 2021-01-12 11:28
1、谁告诉你int类型一定占用2个字节的??
C99标准规定 Long型占用4个字节,Short占用2个字节,而Int类型的规定是大于等于Short,小于等于Long,所以Int类型根据不同的编译器,即有可能是4个字节,也有可能是2个字节
2、在来说取值范围
一个字节有8位,而每一位有0、1两种状态
如果是两个位,就有
0 0,0 1,1 0,1 1;一共4种状态,对应 0 1 2 3 ,也就是2^2
如果是三个位,就有
0 0 0,0 0 1,.........,具体我就不列举,一共8种,也就是2^3
所以,如果是1个字节,8位,就是2^8 = 256
,如果是2个字节,16位,就是2^16 = 65536
如果把最高位0看作正,1看作负,那么2个字节的取值范围就是你所知道的范围了追问纠正一下你的小疏忽,0 0 ,0 1,1 0 ,1 1;共有4中状态不错,但是其取值是0到3,可以写为0到2^2-1。您能否把最高位是0时为正,1为负这种情况下,接着说其取值范围的情况?追答我们一般说的Int类型都是带正负的,也就是最高位用来标记正负
如果最高不用来标记正负,就是正整数,就应该带上unsigned关键字
也就是 unsigned int 类型
对于2位来说,如果是unsigend,前面已经说清楚了
如果第2位用来标记正负
0 0 仍然是0
0 1 让然是1
那么正数的范围 就是 0~2^(2-1)-1
1 0 人为规定 -2 = -2^(2-1)
1 1 是-1
这个涉及到补码的知识,当最高位为1,其他位为0的时候,就代表那个最小的负整整
1000 0000 就是-2^(8-1)
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息!
大家都在看
推荐信息