C-为什么char c = 129将转换为-127?
如果我们将+128
分配给char变量,那么由于二进制等价( 10000000-first bit tells sign
),它被转换为-128
。 二进制当量为129
是10000001
,它将被转换为什么值?
char c = 129;
谢谢,S
实际上有几种可能性。
如果char
是签名类型,那么
char c = 129;
隐式地将int
值转换为char
。 结果是实现定义的 (或者它可以引发实现定义的信号,但我不知道有任何实现这样做)。 在大多数实现中,转换产生 – 127
因为签名类型使用二进制补码表示。 在无符号8位类型中, 10000001
表示值129
; 在带符号的 8位类型中,相同的位模式表示-127
; 转换不需要保持相同的位模式,但它通常是这样。
如果plain char
是无符号类型(就像在某些系统上那样),则值129
在char
范围内,转换只会产生值129
。
但所有这些都假设char
是8位。 C标准要求CHAR_BIT
(字节中的位数,或等效于char
对象中的位数) 至少为 8,但它允许它更大。 您不太可能遇到CHAR_BIT > 8
的系统,但在DSP的 C实现中并不罕见。
取决于所有这一点很少是一个好主意。 无论你想通过将129分配给一个char
对象来实现什么,很可能会有更好,更清晰,更便携的方式来实现它。
负数存储为2对该数字正数的补充。
例如:
-127 is stored as 2's compliment of 127 127 is 01111111 in binary 2's compliment=(1's compliment of a number) + 1 therefore, 2's compliment of 127(01111111) is 10000001(-127). And 10000001 is 129:: Therefore when you give 129 to a char variable, compiler takes it as negative number 127.
同样,130将被指定为-126。
谢谢!!
当数字处于负域(即,签名位为1
)时,当“实际”二进制表示(即忽略签名位,仅处理存储该数字的部分)为0时,它们假设最小值。
例如
带符号的二进制数: 10000000
表示十进制的-128。
这是有意义的,因为二进制表示的每个增量也有十进制数的增量(记住-127是一个多于-128)。 如果您只处理十进制并忽略禁止溢出行为的任何规则,您将看到当数字接近最大正值时,它立即采用最大负值并计数到0。
您可以看到的另一点是-1的二进制表示forms为11111111
。 如果我们将此增加1,我们得到1 00000000
,其中前导的一个被丢弃,给我们数字0。
确定带符号负数的值的快速方法是采用二进制表示(忽略签名位)并将其添加到最大负数。
例如
如果我们的二进制表示为10000001
,其中无符号值为129,我们可以看到忽略我们有1
的签名位,我们将其添加到-128,得到-127的答案。
请注意:我忽略了有时不允许溢出并且可能导致未定义的行为的事实。 我也在处理这个答案中签名的字符。 如果你有一个处理无符号字符的情况,那么使用完整的二进制表达式给它它的值(例如10000001
= 129)。
尝试在char中存储+129会导致在其中存储-127。 当我们尝试在char中存储+128时,第一个数字在负面,即-128被存储。 这是因为从+128,0000000的9位二进制文件中,只存储了最右边的8位。 但是当存储10000000时,最左边的位是1并且它被视为符号位。 因此,数字的值变为-128,因为它确实是-128的二进制(2的补码)。一般来说,如果我们超出正面的范围,我们最终会在负面。 反之亦然。 如果我们从负面超出范围,我们就会在积极方面结束。