C语言 位溢出时为什么丢弃MSB?

41ik7eoe  于 2023-03-17  发布在  其他
关注(0)|答案(6)|浏览(144)

unsigned char为例。
其范围为0 to 255
如果我尝试在其中存储256,将发生以下情况:-
256的二进制
100000000
由于它由9-bits组成,因此MSB 1将被丢弃,它将变为
00000000
也就是0
所以我想知道为什么只去掉了最左边的部分?

yqyhoc1h

yqyhoc1h1#

因为当你只有8位空间时,这是最合理和有用的事情。
丢弃 * 最低 * 位将是一个坏主意,因为现在你不能再增加整数来获得下一个整数mod 28,等等...它将成为无用的,只要它溢出。
丢弃中间的任何其他部分都将是怪异的,任何其他类型的尴尬转变都将有效地接近疯狂。

rdrgkggo

rdrgkggo2#

在结果中仅能保留最低8位的原因是每个位的有效性是恒定的:位0是个位数,位1是二位数,位2是四位数,以此类推。没有额外的存储空间,就无法“改变”这些位的含义。(这只是我的一个猜测)得到你对可能发生的其他事情的期望有指数的存储空间,以便有效位中每个位的有效性可以根据要存储的值的大小而变化。要认识到的重要一点是,这种变化本身需要存储空间(以指数的形式),并且不能发生在每一位具有特定的固定含义的整数/定点类型中。

rm5edbpk

rm5edbpk3#

如果你有8个十进制数来表示一个数字,我们就可以表示100,000,000的值,范围从00,000,00099,999,999,当我们向上计数时,我们会得到:

00,000,000
00,000,001
00,000,002
00,000,003

...

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 ???

继续数下去没有意义了因为我们的数字已经没有意义了。

rjjhvcjd

rjjhvcjd4#

一旦你删除了最左边的一位,你就有了一个8位的数字,它可以很好地适合一个字节(无符号字符)。删除多个位是没有意义的,因为你不需要这样做,以减少特定的数字到8位。只有最低的8位可以在存储一个值在无符号字符。

xtfmy6hx

xtfmy6hx5#

C是一种低级语言,它与实际硬件Map紧密。在类型char下面,有一个假设,即CPU有一个8位寄存器,由固定数量的晶体管和导线组成。
由于计算机无法增加物理资源的数量,因此选择类型char来表示整数 * 模 * 256。
在计算机体系结构上,其中原语资源是9位单元,char保存9位。
高级语言,通常是解释的,OTOH可以并且经常“增长”变量宽度。

qvtsj1bj

qvtsj1bj6#

So I want to know that why only left most bit is removed?
这真的不是“只最左边的位被 * 删除 *"的问题...而是**最右边的八位被 * 保留 *。如果不是最右边的八位,那么你认为应该保留哪些位呢?你不能保留所有的九位,它只是一个8位的值!

相关问题