c - %d 长整型

标签 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;
}

谢谢

最佳答案

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

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

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

关于c - %d 长整型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10328109/

相关文章:

c - 如何使用 printf() 格式化字符串以获得相同的输出长度

java - long 和 double 每次都工作的时候,为什么 Java 中的数字类型那么多?

python - C - 有符号和无符号整数

c - 寻找给定整数的最大质因数

c - 特定情况下的段错误(核心转储)

casting - 长到 HWND (VS8 C++)

java - 将 AtomicLong 添加到 AtomicLong 中?

c - 当我只能定义一个可变长度数组时,为什么要使用 malloc()?

linux - printf + bash 脚本

python - 如何打印变量之间的空格?