[英]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 实现有一个带符号的八位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
因为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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.