为什么此程序输出负值?
#include <stdio.h> int main() { char a = 'a', b = 'b', c; c = a + b; printf("%d", c); }
这些值不是应该转换成ASCII码然后加起来吗?
hmae6n7t1#
在最常见的平台上,char是一个带符号的类型,可以表示从-127到+128的值。您似乎正在使用一个char具有这些属性的平台。请注意,在某些平台上,char是无符号的,因此可表示值的范围是0到255。但是,您似乎没有使用这样的平台。将'a'加到'b'等于将它们的ASCII值(分别为97和98)相加,得到的结果为195。在您的平台上,此结果不能表示为char。在许多实现中,第一位是符号位,因此得到-61。使用unsigned char会产生可打印7比特ASCII字符的预期结果。
char
-127
+128
0
255
'a'
'b'
97
98
195
-61
unsigned char
#include <stdio.h> int main() { char a = 'a', b = 'b'; unsigned char c; c = a + b; printf("%d\n",a); printf("%d\n",b); printf("%d\n", c); }
输出:
97 98 195
31moq8wy2#
a = 97 b = 98 a+b = 195
195超出有符号8位范围(-128... 127)
195 = 0b11000011
在有符号8位表示中,这等于-61。
uxhixvfz3#
正如3Dave所解释的,char是一个有符号类型,两个这种类型的变量相加会导致溢出,并产生负值。即使使用unsigned char,这个和也会导致溢出,但不会产生负值。
3条答案
按热度按时间hmae6n7t1#
在最常见的平台上,
char
是一个带符号的类型,可以表示从-127
到+128
的值。您似乎正在使用一个char
具有这些属性的平台。请注意,在某些平台上,
char
是无符号的,因此可表示值的范围是0
到255
。但是,您似乎没有使用这样的平台。将
'a'
加到'b'
等于将它们的ASCII值(分别为97
和98
)相加,得到的结果为195
。在您的平台上,此结果不能表示为char
。在许多实现中,第一位是符号位,因此得到-61
。使用
unsigned char
会产生可打印7比特ASCII字符的预期结果。输出:
31moq8wy2#
195超出有符号8位范围(-128... 127)
在有符号8位表示中,这等于-61。
uxhixvfz3#
正如3Dave所解释的,char是一个有符号类型,两个这种类型的变量相加会导致溢出,并产生负值。即使使用
unsigned char
,这个和也会导致溢出,但不会产生负值。