【发布时间】:2016-12-17 21:06:11
【问题描述】:
例如,无符号字符如何将值从-128 获取到+127?据我了解,最高有效位用于表示数字的符号,而 char 的其余位用于表示数字的大小。现在,7 位的最大可能幅度是127,那么范围不应该是从-127 到+127 吗? -128怎么会是结果?
其次,以下行为背后的位级逻辑是什么
#include <stdio.h>
int main()
{
signed char x = 127;
x += 1;
printf("%i", x);
}
输出:
-128
正如你所见,x 变成了-128,但为什么呢?这种行为背后的算法是什么?
【问题讨论】:
-
查找 One's Complement 和 Two's Complement 以了解整数类型在内存中的表示方式。
-
您需要阅读二进制数的补码。不用在这里问
-
“据我了解,最高位是用来表示数字的符号的。” --> C 指定表示有符号整数的 3 种方法中的 1 种包括二进制补码(最常见)。在这种情况下,最高有效位代表
-256。 -
C 标准现在允许三种不同的有符号整数表示。您所描述的符号幅度是其中之一,但不是很常见。最常用的称为 2 的补语,它的负数范围更大。
-
位级逻辑:十进制
127是二进制01111111。添加1得到二进制10000000。清除第 7 位的正整数已变为第 7 位设置的负整数(2 的补码),十进制值-128。但如前所述,在 C 语言中,有符号整数是未定义的行为,因为这不是表示有符号整数的唯一方法。
标签: c undefined-behavior unsigned twos-complement