为什么在位溢出时丢弃MSB?

时间:2014-02-23 06:15:12

标签: c char unsigned bits

unsigned char为例。

其范围为0 to 255

如果我尝试将256存储在其中,将会发生以下情况: -

256的二进制文件

  

亿

因为它由9-bits组成,因此MSB 1将被丢弃,它将成为

  

00000000

哪个是0

所以我想知道为什么只删除大部分位?

6 个答案:

答案 0 :(得分:2)

因为它是最合理的&当你只有8位空间时会发生这种有用的事情。

丢弃最下面的位是一个坏主意,因为现在你不能再增加整数来获得下一个整数mod 2 8 等...它会一旦溢出就变得毫无用处。
放弃中间的任何其他位置都是奇怪的,任何其他类型的尴尬转变都会有效地与精神错乱接近。

答案 1 :(得分:2)

结果中只保留最低8位的原因是每个位的重要性是恒定的:位0是位置,位1是两位,位2是四位,等等。如果没有额外的存储空间,就无法“改变”任何这些位的含义。浮点数,你可能(这只是我的一个猜测)是你期望其他可能发生的事情存储指数,所以有效数字中每个位的重要性可能会根据值的大小而变化你想要存储。要实现的重要一点是,这种变化本身需要存储(以指数的形式),并且不能以整数/定点类型发生,其中每个位具有特定的固定含义。

答案 2 :(得分:1)

删除最左边的位后,您有一个8位数字,它可以正确地适合一个字节(unsigned char)。删除多个位是没有意义的,因为您不需要这样做以将该特定数字减少到8位。将值存储在unsigned char中时,只能保留最低的8位。

答案 3 :(得分:1)

C是一种低级语言,它与实际硬件紧密相关。在类型char下面,假设CPU有一个8位寄存器,由固定数量的晶体管和电线组成。

由于计算机无法增加物理资源的数量,因此选择类型char来表示整数 modulo 256。

在原始资源为9位单元的计算机体系结构中,char保存9位。

经常被解释的高级语言,OTOH可以并且经常“增长”变量宽度。

答案 4 :(得分:1)

如果您有8个十进制数字来表示数字,则相当于此。在这种情况下,我们可以代表100,000,000个值,范围从099,999,999。当我们计算在内时,我们会:

0
1
2
3

...

99,999,997
99,999,998
99,999,999
???

由于我们没有其他数字来代表100,000,000,最佳做法是什么?我们无法继续增加100,000,000,因为这需要我们没有的另一个数字。为了完成这项工作,我们必须放弃1并获取00,000,000。如果我们记住这个数字现在代表100,000,000 +它的值是什么,这仍然是有意义的。通过这种方式,您可以继续计算,价值至少保持一定的意义:

99,999,998
99,999,999
00,000,000 represents 100,000,000
00,000,001 represents 100,000,001
00,000,002 represents 100,000,002
...

如果我们改为删除最低有效数字(右边的0),我们就会:

99,999,998
99,999,999
10,000,000 ???
10,000,001 ???

继续计算是没有意义的,因为我们的数字已经没有意义了。

答案 5 :(得分:0)

So I want to know that why only left most bit is removed?

这真的不是“只有最左边位被删除”的问题......这就是最右边的八个位是保留。如果不是最右边的八个位,那么你应该保留哪些位?你不能保留所有9位,它只是一个8位值!