繁体   English   中英

字符添加在 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相同。

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

请记住,有符号char可以保存范围从-128127的值,而不是0255

您的 C 实现有一个带符号的八位char ,可能使用 ASCII,并且在将超出范围的值转换为带符号的 integer 类型时,包装模 2 w ,其中w是宽度(位数)类型。 这些都是实现定义的; 它们在其他 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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM