这是代码(复制和粘贴):
#include <stdio.h>
int main(){
char x,y,result;
//Sample 1:
x = 35;
y = 85;
result = x + y;
printf("Sample 1: %hi + %hi = %hi\n",x ,y, result);
//Sample 2:
x = 85;
y = 85;
result = x + y;
printf("Sample 2: %hi + %hi = %hi\n",x ,y, result);
return 0;
}
我试过编译它但它不起作用。我是愚蠢的还是在开始时是“int”还是“short”而不是char?一旦我改变了它就行了,但是我担心它应该按原样工作...... 程序真的只是添加x和y并显示结果吗?如果我使用short而不是char,那就是它的作用。
提前致谢!
E:为什么选票下降?我的帖子出了什么问题?答案 0 :(得分:4)
对于入门课程,这是一个可怕的示例。根据您的实施,char
是有符号或无符号的号码。根据这个事实,代码的表现会有很大不同。
话虽如此,是的,这段代码基本上是添加两个数字并打印结果。我同意%hi
很奇怪。预计会short int
。我个人希望%hhi
或%i
,并让整数推广做到这一点。
85 + 35 == 120
,可能小于CHAR_MAX(可能是255)。所以没有问题,一切正常。85 + 85 == 170
,可能小于CHAR_MAX(可能是255)。所以没有问题,一切正常。85 + 35 == 120
,可能小于CHAR_MAX(可能是127)。所以没有问题,一切正常。85 + 85 == 170
,可能比CHAR_MAX 更强。这会导致有符号整数溢出,这是未定义的行为。答案 1 :(得分:2)
程序的输出似乎是
Sample 1: 35 + 85 = 120
Sample 2: 85 + 85 = -86
我在http://ideone.com/上编译了这个并且它工作正常。
输出实际上是您所期望的。该计划正在运作!您看到一个您不期望的数字的原因是由于char
数据类型的宽度 - 1个字节。
C标准并未规定char
是有符号还是无符号,但假设它已签名,则可以表示-128
到127
范围内的数字(字符为8位或1)字节)。超出此范围的85 + 85 = 170
...字节的MSB变为1,数字系统换行以给出负数。尝试阅读twos compliment arithmetic。
算术是:
01010101 +
01010101
--------
10101010
由于数据类型已签名且MSB已设置,因此该数字现为负数,在本例中为-86
注意:比尔林奇的答案......他正确地指出签名溢出是UB