[英]short and int in c
short int a,b,c;
scanf("%d%d",&a,&b);
c = a + b;
printf("%d %d %d",a,b,c);
输入: 5 8
输出: 0 8 8
为什么值a
0? 任何人都能解释一下吗?
平台--- GCC ubuntu 10.04
具有"%d"
格式的scanf
需要int*
参数。 你给它一个short int*
参数,因此你的程序的行为是未定义的。
如果你真的想知道为什么你得到你得到的结果,我可以推测,但更正你的代码更容易:
scanf("%hd%hd", &a, &b);
您可以继续对printf
使用"%d"
,因为short int
参数被提升为int
。 您可以在printf
使用"%hd"
,但这不是必需的。 (对于int*
没有类似的short int*
参数的提升。)
你可以放心地在这里停止阅读。
以下是关于您的错误代码中可能发生的事情的一些猜测。 这不是解决方案; 解决方案是纠正您的代码,使其完成您希望它执行的操作。 但是,如果错误的代码行为不当,可能会有所帮助。
假设short
是16位, int
是32位,这是典型的。 格式字符串中的第一个"%d"
告诉scanf
读取一个值(您给它5
)并将其存储到第二个参数&a
指向的32位int中。 由于a
只有16个buts,它会将一半的32位值存储在a
,另一半存储在一些相邻的内存块中。 第二个"%d"
与&b
做同样的事情; 它存储的32位表示的一半8
中b
,而另一半在别处。
根据您的输出,似乎第二个"%d"
导致scanf
将值8
的低16位存储在b
,而高阶16位(值为0)存储在a
,覆盖存储的值由第一个"%d"
。 请注意,第一个"%d"
中的高16位可能存储在其他位置,可能会破坏其他一些变量,或者可能写入一些未使用的内存。
所以结果是,你已经存储在第0 a
和8 b
,这说明你得到的输出。
所有这些都是非常具有推测性的,许多其他结果都是可能的。 这种分析仅用于跟踪错误代码的行为,目的是纠正它。 编写故意利用这种东西的代码是一个非常糟糕的主意。 该语言完全没有说明像这样的错误代码会做什么; 它的行为可能在不同的系统上有很大的不同,有不同的编译器设置,甚至取决于月亮的相位。
在VC ++ 6.0中, c
值为13。
#include <stdio.h>
int main()
{
short int a,b,c;
scanf("%d%d",&a,&b);
c = a + b;
printf("%d + %d = %d\n",a,b,c);
return 0;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.