下面的代码正确吗?据我所知,它应该不能正常工作,但是在 Dev-C++ 编译器上,它可以。有人能详细解释一下吗?
#include<limits.h>
int main()
{
long int num_case=LONG_MAX;
scanf("%d",&num_case);
printf("%ld",num_case);
return 0;
}
谢谢
最佳答案
与标准 C 库告诉您不要做的大多数事情一样,它会调用未定义的行为。未定义意味着它可能在某些条件下工作,但在您最意想不到的时候崩溃。
在这种情况下,它起作用是因为 long int
和 int
实际上是相同的数字表示:四字节,二进制补码。对于另一个平台(例如 x86-64 Linux),情况可能并非如此,您可能会看到某种问题。特别是,8 字节 long int
的高位字节将保持未初始化状态。
编辑:问“但它会崩溃吗”是错误的思考方式。根据语言标准,仅将未初始化的字节读入类型为 long int
的变量就可以使 C 程序崩溃。我们不需要找到一个这样做的平台的例子,就可以理解这个程序是错误的。这就是重点。 C 不会立即将规则手册扔给您,它会等到您移植并打破最初的假设。
关于c - %d 长整型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10328109/