%D与Long Int

时间:2012-04-26 06:12:13

标签: c printf long-integer scanf

以下代码是否正确?据我所知,它不应该正常工作,但在Dev-C ++编译器上,确实如此。有人可以详细解释一下吗?

#include<limits.h>

int main()
{
long int num_case=LONG_MAX;

scanf("%d",&num_case);

printf("%ld",num_case);
return 0;
}

由于

3 个答案:

答案 0 :(得分:4)

与标准C库告诉您不要做的大多数事情一样,它会调用未定义的行为。未定义意味着它可能在某些条件下工作,但在您最不期望的时候崩溃。

在这种情况下,它起作用,因为long intint实际上是相同的数字表示:四个字节,两个补码。使用另一个平台(例如x86-64 Linux),情况可能并非如此,您可能会看到某种问题。特别是,8字节long int的高位字节将保持未初始化状态。

编辑:询问“但它会崩溃”是以错误的方式思考。根据语言标准,仅允许将未初始化的字节读入类型long int的变量中以使C程序崩溃。我们不需要找到一个这样做的平台的例子,以了解该程序是不明确的。这就是重点。 C不会立即向您发出规则手册,它会等到您移植并打破初始假设。

答案 1 :(得分:1)

正如RageD所说,你真的应该在scanf()电话中使用%ld。它起作用的原因是因为在您的系统上(或者在我看来),intlong int的大小相同(可能是4),因此scanf()不会覆盖任何内存它不应该。

答案 2 :(得分:0)

通常在32位系统上,long int有32位(与int相同),在64位系统中,long int有64位(与long long int相同)。如果您希望代码可移植,请使用带有“%ld”的scanf。