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

标签 c types syntax scanf

<分区>

#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 个最低有效位置(little endian),而高 4 个最重要字节保持其不确定的值 - 即垃圾,因为变量从未被初始化。

所以在实践中,如果您将 long long 初始化为零,您实际上可能会得到预期的输出,但没有任何保证。

关于C:int 类型存储为 long long 类型时,技术上会发生什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69032132/

相关文章:

c - 需要单链表的帮助

c - 真的不检查close()的返回值: how serious,吗?

c++ - C++检查unordered_map/map的std::array包含相同的元素类型

Python - 仅一种类型的集合

c++ - 如果变量名不跟在 char* 后面,const char* 是否有效?

c - 当我尝试使用 struct 运行程序时出现段错误(核心已转储)

c - 读取并解码 jpg 图片

c++ - 当可能有许多派生类型时,从基类型的实例中获取派生类型

c# - 编程术语 - 字段、成员、属性 (C#)

java:将一个变量与其他几个变量进行比较的最简洁方法