字符加法在 C 中没有预期的结果
Char addition does not have expected result in C
谁能解释一下最后是怎么回事
a=?,b=?,c=-124
而不是
a=?,b=?,c=132
这是代码:
#include <stdio.h>
int main() {
char a = 'D', b='C', c='A';
a = c + 'D';
b = a + b + 'A';
c = b - a;
a = a - b + 'C';
b = b - 68;
printf("a=%c,b=%c,c=%d", a, b, c);
}
您的系统上显示 char
已签名。对于 ASCII,'D'
、'C'
和 'A'
分别与整数 68
、67
和 65
相同。
将 68
添加到 65
,您将得到 133
。 133
的二进制表示是10000101
。请注意,最高有效位是 1
。当您使用带符号的字符时,二进制补码开始发挥作用,结果实际上是 -123
.
请记住,带符号的 char
可以包含从 -128
到 127
的值,而不是 0
到 255
。
您的 C 实现有一个带符号的 eight-bit char
,可能使用 ASCII,并且在将 out-of-range 值转换为带符号整数类型时,换行模 2w,其中 w 是类型的宽度(位数)。这些都是implementation-defined;它们在其他 C 实现中可能有所不同,但有一定的限制。
char a = 'D', b='C', c='A';
将 a
初始化为 68,将 b
初始化为 67,将 c
初始化为 65。
a = c + 'D';
将 65 + 68 = 133 分配给 a
。由于 133 不适合 char
,它换行为 133 − 256 = −123.
b = a + b + 'A';
将 −123 + 67 + 65 = 9 分配给 b
.
c = b - a;
将 9 − −123 = 132 分配给 c
。这会变成 132 − 256 = −124。
a = a - b + 'C';
将 −123 − 9 + 67 = −65 分配给 a
.
b = b - 68;
将 9 − 68 = −59 分配给 b
.
printf("a=%c,b=%c,c=%d", a, b, c);
打印a=?,b=?,c=-124
,因为a
和b
是异常字符的编码,c
的值为-124。
您的编译器似乎将 char
视为 signed char
,因此:
a = 'D', b='C', c='A'
a = c + 'D'
= 'A' + 'D'
= 65 + 68
= 133
但由于 a
是 signed char
,它变成 -123
(133-256)
b = a + b + 'A'
= -123 + 'C' + 'A'
= -123 + 67 + 65
= 9
c = b - a
= 9 - -123
= 9 + 123
= 132
a = a - b + 'C'
= -123 - 9 + 66
= -66
b = b - 68
= 9 - 68
= `-59``
所以最后,a = -66
、b = -59
和c = 132
谁能解释一下最后是怎么回事
a=?,b=?,c=-124
而不是
a=?,b=?,c=132
这是代码:
#include <stdio.h>
int main() {
char a = 'D', b='C', c='A';
a = c + 'D';
b = a + b + 'A';
c = b - a;
a = a - b + 'C';
b = b - 68;
printf("a=%c,b=%c,c=%d", a, b, c);
}
您的系统上显示 char
已签名。对于 ASCII,'D'
、'C'
和 'A'
分别与整数 68
、67
和 65
相同。
将 68
添加到 65
,您将得到 133
。 133
的二进制表示是10000101
。请注意,最高有效位是 1
。当您使用带符号的字符时,二进制补码开始发挥作用,结果实际上是 -123
.
请记住,带符号的 char
可以包含从 -128
到 127
的值,而不是 0
到 255
。
您的 C 实现有一个带符号的 eight-bit char
,可能使用 ASCII,并且在将 out-of-range 值转换为带符号整数类型时,换行模 2w,其中 w 是类型的宽度(位数)。这些都是implementation-defined;它们在其他 C 实现中可能有所不同,但有一定的限制。
char a = 'D', b='C', c='A';
将 a
初始化为 68,将 b
初始化为 67,将 c
初始化为 65。
a = c + 'D';
将 65 + 68 = 133 分配给 a
。由于 133 不适合 char
,它换行为 133 − 256 = −123.
b = a + b + 'A';
将 −123 + 67 + 65 = 9 分配给 b
.
c = b - a;
将 9 − −123 = 132 分配给 c
。这会变成 132 − 256 = −124。
a = a - b + 'C';
将 −123 − 9 + 67 = −65 分配给 a
.
b = b - 68;
将 9 − 68 = −59 分配给 b
.
printf("a=%c,b=%c,c=%d", a, b, c);
打印a=?,b=?,c=-124
,因为a
和b
是异常字符的编码,c
的值为-124。
您的编译器似乎将 char
视为 signed char
,因此:
a = 'D', b='C', c='A'
a = c + 'D'
= 'A' + 'D'
= 65 + 68
= 133
但由于 a
是 signed char
,它变成 -123
(133-256)
b = a + b + 'A'
= -123 + 'C' + 'A'
= -123 + 67 + 65
= 9
c = b - a
= 9 - -123
= 9 + 123
= 132
a = a - b + 'C'
= -123 - 9 + 66
= -66
b = b - 68
= 9 - 68
= `-59``
所以最后,a = -66
、b = -59
和c = 132