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