Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
任务:描述下面的C程序是做什么的?_C - Fatal编程技术网

任务:描述下面的C程序是做什么的?

任务:描述下面的C程序是做什么的?,c,C,这是代码(复制并粘贴): #包括 int main(){ 字符x,y,结果; //样本1: x=35; y=85; 结果=x+y; printf(“样本1:%hi+%hi=%hi\n”,x,y,结果); //样本2: x=85; y=85; 结果=x+y; printf(“样本2:%hi+%hi=%hi\n”,x,y,结果); 返回0; } 我试着编译它,但不起作用。我是愚蠢的还是一开始就用“int”或“short”而不是char?一旦我改变了它的工作,但我担心它应该工作,因为它是。。。 这个

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

#包括
int main(){
字符x,y,结果;
//样本1:
x=35;
y=85;
结果=x+y;
printf(“样本1:%hi+%hi=%hi\n”,x,y,结果);
//样本2:
x=85;
y=85;
结果=x+y;
printf(“样本2:%hi+%hi=%hi\n”,x,y,结果);
返回0;
}
我试着编译它,但不起作用。我是愚蠢的还是一开始就用“int”或“short”而不是char?一旦我改变了它的工作,但我担心它应该工作,因为它是。。。 这个程序真的只是把x和y相加并显示结果吗?如果我用short而不是char,它就是这样做的

提前谢谢


E:为什么会有反对票?我的帖子怎么了?

程序的输出似乎是错误的

Sample 1: 35 + 85 = 120
Sample 2: 85 + 85 = -86
我编译了这个,效果很好

输出实际上是您所期望的。程序正在运行!您看到一个不期望的数字的原因是由于
char
数据类型-1字节的宽度

C标准没有规定字符是有符号的还是无符号的,但假设它有符号,它可以表示范围在
-128
127
之间的数字(字符是8位或1字节)<代码>85+85=170超出此范围。。。字节的MSB变为1,数字系统换行以给出负数。试着仔细阅读

算法是:

 01010101 +
 01010101
 --------
 10101010
因为数据类型是有符号的,并且设置了MSB,所以数字现在是负数,在本例中为-86

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

思想: 对于入门课程,这是一个糟糕的例子。根据您的实现,
char
是有符号或无符号的数字。根据这一事实,代码的行为将非常不同

这就是说,是的,这个代码基本上是添加两个数字并打印结果。我同意
%hi
是奇怪的。它需要一个
短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\u MAX大。这会导致有符号整数溢出,这是未定义的行为

但它不起作用
-请描述您得到的错误,以及实际不起作用的错误(您得到的输出与您期望的输出),它在这里编译得很好。什么不起作用?它编译吗?如果没有,在哪行上会出现什么错误?如果你写“它不起作用”,这个问题很可能会被否决。而且,请包括你是如何编译它的-使用
gcc-std=c99-pedantic-Wall
我没有收到错误或警告只是一个礼貌的提醒,你的否决票是因为你(可能)滥用stackoverflow。对我来说,这似乎是大学一年级的项目(或者你自己也在学习C)。Stackoverflow适用于专业人士不常见/阻碍的问题。没有人想对你刻薄:)当你说某些东西不起作用时,你应该解释两件事:(#1)你希望你的程序做什么,以及(#2)程序做了什么。另外,你文章的标题是一块向下投票磁铁。有符号整数溢出实际上是未定义的:非常好的观点,谢谢比尔+1到你的主要答案和评论:)有趣的链接。。。学到了一些东西
 01010101 +
 01010101
 --------
 10101010