以unsigned char为例。其范围为0 to 255。如果我尝试在其中存储256,将发生以下情况:-256的二进制100000000由于它由9-bits组成,因此MSB 1将被丢弃,它将变为00000000也就是0。所以我想知道为什么只去掉了最左边的部分?
unsigned char
0 to 255
256
9-bits
1
0
yqyhoc1h1#
因为当你只有8位空间时,这是最合理和有用的事情。丢弃 * 最低 * 位将是一个坏主意,因为现在你不能再增加整数来获得下一个整数mod 28,等等...它将成为无用的,只要它溢出。丢弃中间的任何其他部分都将是怪异的,任何其他类型的尴尬转变都将有效地接近疯狂。
rdrgkggo2#
在结果中仅能保留最低8位的原因是每个位的有效性是恒定的:位0是个位数,位1是二位数,位2是四位数,以此类推。没有额外的存储空间,就无法“改变”这些位的含义。(这只是我的一个猜测)得到你对可能发生的其他事情的期望有指数的存储空间,以便有效位中每个位的有效性可以根据要存储的值的大小而变化。要认识到的重要一点是,这种变化本身需要存储空间(以指数的形式),并且不能发生在每一位具有特定的固定含义的整数/定点类型中。
rm5edbpk3#
如果你有8个十进制数来表示一个数字,我们就可以表示100,000,000的值,范围从00,000,000到99,999,999,当我们向上计数时,我们会得到:
100,000,000
00,000,000
99,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 ???
继续数下去没有意义了因为我们的数字已经没有意义了。
rjjhvcjd4#
一旦你删除了最左边的一位,你就有了一个8位的数字,它可以很好地适合一个字节(无符号字符)。删除多个位是没有意义的,因为你不需要这样做,以减少特定的数字到8位。只有最低的8位可以在存储一个值在无符号字符。
xtfmy6hx5#
C是一种低级语言,它与实际硬件Map紧密。在类型char下面,有一个假设,即CPU有一个8位寄存器,由固定数量的晶体管和导线组成。由于计算机无法增加物理资源的数量,因此选择类型char来表示整数 * 模 * 256。在计算机体系结构上,其中原语资源是9位单元,char保存9位。高级语言,通常是解释的,OTOH可以并且经常“增长”变量宽度。
char
qvtsj1bj6#
So I want to know that why only left most bit is removed?这真的不是“只最左边的位被 * 删除 *"的问题...而是**最右边的八位被 * 保留 *。如果不是最右边的八位,那么你认为应该保留哪些位呢?你不能保留所有的九位,它只是一个8位的值!
So I want to know that why only left most bit is removed?
6条答案
按热度按时间yqyhoc1h1#
因为当你只有8位空间时,这是最合理和有用的事情。
丢弃 * 最低 * 位将是一个坏主意,因为现在你不能再增加整数来获得下一个整数mod 28,等等...它将成为无用的,只要它溢出。
丢弃中间的任何其他部分都将是怪异的,任何其他类型的尴尬转变都将有效地接近疯狂。
rdrgkggo2#
在结果中仅能保留最低8位的原因是每个位的有效性是恒定的:位0是个位数,位1是二位数,位2是四位数,以此类推。没有额外的存储空间,就无法“改变”这些位的含义。(这只是我的一个猜测)得到你对可能发生的其他事情的期望有指数的存储空间,以便有效位中每个位的有效性可以根据要存储的值的大小而变化。要认识到的重要一点是,这种变化本身需要存储空间(以指数的形式),并且不能发生在每一位具有特定的固定含义的整数/定点类型中。
rm5edbpk3#
如果你有8个十进制数来表示一个数字,我们就可以表示
100,000,000
的值,范围从00,000,000
到99,999,999
,当我们向上计数时,我们会得到:既然我们没有另一个数字来表示
100,000,000
,最好的做法是什么?我们不能一直递增到100,000,000
,因为这需要另一个我们没有的数字。要做到这一点,我们必须去掉左边的1
,得到00,000,000
,如果我们记住这个数字现在表示100,000,000
+,这仍然是有意义的不管它的值是什么。这样,你可以继续计数,值至少保持一定的意义:如果我们去掉最低有效位(右边的0),我们将得到:
继续数下去没有意义了因为我们的数字已经没有意义了。
rjjhvcjd4#
一旦你删除了最左边的一位,你就有了一个8位的数字,它可以很好地适合一个字节(无符号字符)。删除多个位是没有意义的,因为你不需要这样做,以减少特定的数字到8位。只有最低的8位可以在存储一个值在无符号字符。
xtfmy6hx5#
C是一种低级语言,它与实际硬件Map紧密。在类型
char
下面,有一个假设,即CPU有一个8位寄存器,由固定数量的晶体管和导线组成。由于计算机无法增加物理资源的数量,因此选择类型
char
来表示整数 * 模 * 256。在计算机体系结构上,其中原语资源是9位单元,char保存9位。
高级语言,通常是解释的,OTOH可以并且经常“增长”变量宽度。
qvtsj1bj6#
So I want to know that why only left most bit is removed?
这真的不是“只最左边的位被 * 删除 *"的问题...而是**最右边的八位被 * 保留 *。如果不是最右边的八位,那么你认为应该保留哪些位呢?你不能保留所有的九位,它只是一个8位的值!