C-为什么char c = 129将转换为-127?

如果我们将+128分配给char变量,那么由于二进制等价( 10000000-first bit tells sign ),它被转换为-128 。 二进制当量为12910000001 ,它将被转换为什么值?

char c = 129;

谢谢,S

实际上有几种可能性。

如果char是签名类型,那么

 char c = 129; 

隐式地将int值转换为char 。 结果是实现定义的 (或者它可以引发实现定义的信号,但我不知道有任何实现这样做)。 在大多数实现中,转换产生 – 127因为签名类型使用二进制补码表示。 在无符号8位类型中, 10000001表示值129 ; 在带符号的 8位类型中,相同的位模式表示-127 ; 转换不需要保持相同的位模式,但它通常是这样。

如果plain char是无符号类型(就像在某些系统上那样),则值129char范围内,转换只会产生值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的补码)。一般来说,如果我们超出正面的范围,我们最终会在负面。 反之亦然。 如果我们从负面超出范围,我们就会在积极方面结束。