c中的short和int

时间:2011-12-23 20:22:42

标签: 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

3 个答案:

答案 0 :(得分:11)

带有scanf格式的

"%d"需要int*个参数。你给它一个short int*参数,因此你的程序的行为是未定义的。

如果你真的想知道为什么你得到了你得到的结果,我可以推测,但更正你的代码要容易得多:

scanf("%hd%hd", &a, &b);

您可以继续"%d"使用printf,因为short int参数会提升为int。您可以将"%hd"printf一起使用,但这不是必需的。 (short int*的{​​{1}}参数没有类似的推广。)


您可以放心地在这里停止阅读。


以下是关于您的错误代码中可能发生的事情的一些猜测。这不是解决方案;解决方案是纠正您的代码,使其完成您希望它执行的操作。但是,如果错误的代码错误行为可能会有所帮助。

假设int*是16位,short是32位,这是典型的。格式字符串中的第一个int告诉"%d"读取一个值(您给它scanf)并将其存储到第二个参数{{1}指向的32位int中}}。由于5只有16个buts,它将在&a中存储一半的32位值,在另一个相邻的内存块中存储另一半。第二个aa做同样的事情;它将"%d"的32位表示的一半存储在&b中,另一半存储在其他地方。

根据您的输出,第二个8似乎导致b"%d"中的值scanf的低16位存储在8中在b中排序16位(值为0),覆盖第一个a存储的值。请注意,第一个"%d"中的高16位可能存储在其他位置,可能会破坏其他一些变量,或者可能写入其他未使用的内存。

结果是你在"%d"中存储了0,在a中存储了8,这解释了你得到的输出。

这一切都是非常具有推测性的,许多其他结果都是可能的。这种分析仅用 来跟踪错误代码的行为,目的是纠正它。编写故意利用这种东西的代码是一个非常糟糕的主意。该语言完全没有说明像这样的错误代码会做什么;它的行为在不同的系统上会有很大的不同,有不同的编译器设置,甚至取决于月亮的相位。

答案 1 :(得分:0)

根据这个:

http://www.cplusplus.com/reference/clibrary/cstdio/scanf/

如果您的变量是“short”int而不是常规int

,则需要指定修改

答案 2 :(得分:0)

在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;
}