C:当int类型存储在long long类型中时,技术上会发生什么?


#include <stdio.h>
int main() {
long long a, b;
scanf("%d %d", &a, &b);
printf("%lld", a + b);
return 0;
}

上面的代码读取两个数字并输出它们的和。我知道精确的应该使用格式说明符%lld而不是%d,我认为这是编译错误的原因。

然而,问题是一些编译器,如https://www.programiz.com/c-programming/online-compiler/,执行代码时没有任何语法错误,但打印出如下所示的尴尬值,我根本不明白。

输入:123 -123
输出:235046380240896(此值持续变化)

当int类型存储在long long类型中时,在基础层发生了什么?

形式上这是未定义的行为,因为格式说明符与类型不匹配。所以理论上任何事情都有可能发生。编译器不需要为格式字符串与所提供的变量不匹配提供诊断。

在实践中,许多(32/64位)编译器可能读取4个字节并将它们放在long long的4个最低有效位(小端),而最上面的4个最高有效位保持其不确定的值-即垃圾,因为变量从未初始化。

因此,在实践中,如果您将long long初始化为零,您实际上可能会得到预期的输出,但不能保证它。

这是未定义的行为,所以任何事情都可能发生。在实践中最可能发生的情况是,scanf()将您输入的数字存储到每个64位long long变量的32位一半中。由于您从未初始化该变量,因此另一半包含不可预测的值。这就是为什么你每次都得到不同的结果。

相关内容

最新更新