将无符号字符转换为有符号整数
Converting unsigned char to signed int
考虑以下程序
void main(){
char t = 179;
printf("%d ",t);
}
输出为-77。
但是179的二进制表示是
10110011
因此,考虑到第 1 位是单数位,不应该输出 -51。
-77 的二进制表示是
11001101
好像位序颠倒了。这是怎么回事?请大家指点。
看起来 char
是您系统上的签名类型。 char
的有效范围是 [-128, 127]
通过使用
char t = 179;
编译器使用 179 的 2 的补码(很可能是 -77)并将该值分配给 t
。
Char 可以是有符号的或无符号的:这取决于您的编译器。
如果有符号,可以是2s或者1补码。
此外,它可以大于 8 位,尽管 sizeof char 被定义为 1。
所以依赖于特定的表示是不可取的。
要在 2 的补码中转换正数和负数,请反转所有位,然后加 1。
10110011
01001100(反转所有位)
01001101(加一)
也就是小数点77
请注意,在许多系统上 char
已签名。因此,当您将 179(属于 int
类型)分配给 char
时,此值超出 char
范围,因此它是未指定的行为。
6.3.1.3 有符号和无符号整数:
When a value with integer type is converted to another integer type other than _Bool, if the value can be represented by the new type, it is unchanged. Otherwise, if the new type is unsigned, the value is converted by repeatedly adding or subtracting one more unsigned integer than the maximum value that can be represented in the new type until the value is in the range of the new conversion to type. Otherwise, the new type is signed and the value cannot be represented in it; either the result is implementation-defined or an implementation-defined signal is raised.
如果您将类型更改为 unsigned char
,您的程序将正确执行。
另请注意,char
、signed char
和 unsigned char
是 3 种不同的类型,这与 int
和 signed int
不同。 char
的符号是实现定义的。
您声称 -77
的二进制表示是 11001101
,但反转是您的。 -77
的二进制表示是10110011
.
二进制10110011
无符号为十进制179
.
二进制10110011
有符号的是十进制-77
.
您将超出范围的值 179
分配给了 signed char
。理论上它可能是未定义的行为,但除了抛出错误之外,它会是一个非常糟糕的编译器,它会在 signed char
.
中放置除 8 位值之外的任何内容
但是在打印时,它被解释为负数,因为设置了 b7。
考虑以下程序
void main(){
char t = 179;
printf("%d ",t);
}
输出为-77。 但是179的二进制表示是
10110011
因此,考虑到第 1 位是单数位,不应该输出 -51。 -77 的二进制表示是
11001101
好像位序颠倒了。这是怎么回事?请大家指点。
看起来 char
是您系统上的签名类型。 char
的有效范围是 [-128, 127]
通过使用
char t = 179;
编译器使用 179 的 2 的补码(很可能是 -77)并将该值分配给 t
。
Char 可以是有符号的或无符号的:这取决于您的编译器。
如果有符号,可以是2s或者1补码。
此外,它可以大于 8 位,尽管 sizeof char 被定义为 1。
所以依赖于特定的表示是不可取的。
要在 2 的补码中转换正数和负数,请反转所有位,然后加 1。
10110011
01001100(反转所有位)
01001101(加一)
也就是小数点77
请注意,在许多系统上 char
已签名。因此,当您将 179(属于 int
类型)分配给 char
时,此值超出 char
范围,因此它是未指定的行为。
6.3.1.3 有符号和无符号整数:
When a value with integer type is converted to another integer type other than _Bool, if the value can be represented by the new type, it is unchanged. Otherwise, if the new type is unsigned, the value is converted by repeatedly adding or subtracting one more unsigned integer than the maximum value that can be represented in the new type until the value is in the range of the new conversion to type. Otherwise, the new type is signed and the value cannot be represented in it; either the result is implementation-defined or an implementation-defined signal is raised.
如果您将类型更改为 unsigned char
,您的程序将正确执行。
另请注意,char
、signed char
和 unsigned char
是 3 种不同的类型,这与 int
和 signed int
不同。 char
的符号是实现定义的。
您声称 -77
的二进制表示是 11001101
,但反转是您的。 -77
的二进制表示是10110011
.
二进制10110011
无符号为十进制179
.
二进制10110011
有符号的是十进制-77
.
您将超出范围的值 179
分配给了 signed char
。理论上它可能是未定义的行为,但除了抛出错误之外,它会是一个非常糟糕的编译器,它会在 signed char
.
但是在打印时,它被解释为负数,因为设置了 b7。