任务:描述以下C程序的作用?

时间:2014-10-29 14:54:54

标签: c

这是代码(复制和粘贴):

#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:为什么选票下降?我的帖子出了什么问题?

2 个答案:

答案 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是有符号还是无符号,但假设它已签名,则可以表示-128127范围内的数字(字符为8位或1)字节)。超出此范围的85 + 85 = 170 ...字节的MSB变为1,数字系统换行以给出负数。尝试阅读twos compliment arithmetic

算术是:

 01010101 +
 01010101
 --------
 10101010

由于数据类型已签名且MSB已设置,因此该数字现为负数,在本例中为-86

注意:比尔林奇的答案......他正确地指出签名溢出是UB