“总共表示2^32个数”指的是(-2^31)+(-1)+(0)+(2^31-1)吗?

来源:6-3 数据类型、整数和补码

CheeseCheese_

2021-04-03

【直观的解法①】
假设符号位:
0:表示正数
1:表示负数
后面的数值拼接上
第一位是0,后跟31个1(二进制数)的值:2^31-1(小)
第一位是1,后面跟31个0(二进制数)的值:2^31(大)


【直观的解法②】
第一位:符号位
-1:1000…1(1+30个0+1)
1:0000…1(0+30个0+1)
-1+1算不出来=0

【补码】
负数一共有多少?
-2^31个
正数一共有多少?
2^31-1个
-2^31 + 2^31-1= 2^32-1**【????】**
但是还有一个0,0有多少个、
1个
最后:
2^32-1+1 = 2^32


请帮我看看:

  1. 【直观的解法①】和【直观的解法②】的理解有错误没有?
  2. 总共表示2^32个数 到底指的啥?
  3. -2^31 + 2^31-1= 2^32-1 怎么相加得来的?我还遗漏了什么吗?
  4. -2^31个指的是啥?个数能用负数表示吗?难导致的是二进制数?
    期待解答,谢谢!!
写回答

3回答

ccmouse

2021-04-06

//img.mukewang.com/szimg/606c3522091d46a600000000.jpg

不能回答问题吗

0
0

ccmouse

2021-04-06

抱歉这里左边是二进制数值,右边是与他对应的十进制数值,不是个数。

比如1000...0对应的十进制数值是-2^31

//img.mukewang.com/szimg/606c3522091d46a600000000.jpg

0
0

ccmouse

2021-04-06

抱歉关键在于这张图我没有说清楚。这里右边不是个数,是与左边二进制对应的十进制数值,也就是说1000...0对应的十进制是-2^31

//img.mukewang.com/szimg/606c3522091d46a613800780.jpg

直观解法的理解无所谓,反正我们用的是补码不是“直观解法”,主要是不用补码很难解决我们的问题,比如会出现+0, -0等。

总共表示2^32个数。是指一个32位整数,一共能够表示2^32个不同的数值。这是应该的,因为每一位都有1,0两种可能性,所以必须要能够表示2^32个数值。那么我们需要有一种方案来实现这一点,补码就是普遍采用的方案。(而上述“直观”方案由于有2个0,所以表示不了2^32个数值,不是一个好方案)

所以后面那个相加,是说:负数一共有2^31个,正数2^31-1个,还有一个0,总共的个数是:2^31+(2^31-1)+1(个0)=2^32。和上面的“必须要能够”表示2^32个数值对应。

0
0

Google面试官亲授-Java面试新手尊享课

为面试新手量身定制的Java面试尊享课,解锁“鲤鱼跃龙门”的妙招

2853 学习 · 180 问题

查看课程