短而在C INT

问题描述:

short int a,b,c; 
scanf("%d%d",&a,&b); 
c = a + b; 
printf("%d %d %d",a,b,c); 

输入:5 8短而在C INT

输出:0 8 8

为什么是a 0的值?任何人都可以解释这个吗?

平台--- GCC的Ubuntu 10.04

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

如果你真的想知道为什么你得到你得到的结果,我就可以在猜测,但它更容易只是为了纠正代码:

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

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


您可以安全地停止阅读这里。


以下是关于您的错误代码中可能发生的情况的一些猜测。这不是一个解决方案;解决方案是纠正你的代码,以便它做你想做的事情。但是,看看错误代码的不正确性可能会很有启发性。

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

根据你的输出,看来第二"%d"引起scanf到低位存储在b8的16位,高位的16位(具有0值)a,覆盖值存储在第一个"%d"。请注意,第一个"%d"的高位16位可能存储在其他地方,可能会破坏其他一些变量,或者可能写入其他未使用的内存。

因此,结果是,您在ab中存储了0,这说明了您获得的输出。

所有这些都是非常推测的,许多其他的结果都是可能的。这种分析是有用的只有跟踪不正确的代码的行为,其目的是纠正它。编写故意利用这种事情的代码是一个非常糟糕的主意。该语言绝对没有说这样的错误代码会做什么;它的行为可以在不同的系统,不同的编译器设置,甚至取决于月亮的相位上大不相同。

+0

@Arya Keith的炒作是非常可能是对的。打印'a,b,c'的地址,我得到了&a = 0x7fffee2bee8e,&b = 0x7fffee2bee8c,&c = 0x7fffee2bee8a'(gcc-4.5.1,x86_64)。通过这些地址上的变量,在一个小端系统中,这个推测准确地描述了如果编译器不会因为允许而编造伪造代码而不知所措。 – 2011-12-23 21:39:41

根据此:

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

你需要指定一个修改,如果你的变量是一个 “短” int和不正规INT

+1

请不要使用cplusplus.com:http://programmers.stackexchange.com/q/88241 – 2011-12-23 20:27:51

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

行为未定义; a,b和c的值完全可以是任何东西。 – 2011-12-23 21:37:37