字符加法在 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' 分别与整数 686765 相同。

68 添加到 65,您将得到 133133的二进制表示是10000101。请注意,最高有效位是 1。当您使用带符号的字符时,二进制补码开始发挥作用,结果实际上是 -123.

请记住,带符号的 char 可以包含从 -128127 的值,而不是 0255

您的 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,因为ab是异常字符的编码,c的值为-124。

您的编译器似乎将 char 视为 signed char,因此:

a = 'D', b='C', c='A'

a = c + 'D' = 'A' + 'D' = 65 + 68 = 133

但由于 asigned 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 = -66b = -59c = 132