c - 为什么不同的格式说明符会使用 printf 给出不同的输出?

标签 c

我想知道为什么这段代码的输出是0? y.betap->beta是相同的变量,所以输出不应该是 3 吗?

int main() {
    struct MyType {
        int alpha;
        double beta;
    };
    static struct MyType y;
    struct MyType *p = &y;
    y.alpha = 1;
    p->alpha = 2;
    p->beta = 2.5;
    y.beta = 1.5;
    printf("%d", y.beta + p->beta);
    return 0;
}

最佳答案

chqrlie正确指出,printf("%d", somevariable) 期望变量作为 int 传递,而您的结果是 double输入值。

%d 称为格式说明符。这些是必需的,因为不同的数据类型由处理器以不同的方式传递和解释,可能位于内存中的不同位置或不同的寄存器中(就像 x86_64 平台的情况)。因此,即使具有相同位模式的相同内存位置,根据数据类型的解释也可能有很大不同。这就是另一个示例中发生的情况:

int main() {
    int a = 1048577;;
    printf("%d\n", a);
    printf("%hd", a);  //hd is the format specifier for short int
    return 0;
}

输出:

 1048577 
 1

如您所见,根据您指定的数据类型,相同的变量 a 会有不同的解释。

为什么会这样? 这是 1048577 的二进制表示(假设为 32 位 int):

00000000 00010000 00000000 00000001

如果格式说明符为 short int (%hd),则 Shorts 为 16 位宽,仅使用该值的 16 个低位,因此输出为1

在某些架构(x86 32 位)上,您的情况可能会发生类似的情况,或者在其他架构上发生更糟糕的情况,其中 double 值以不同的方式传递,并且 printf 从调用者未写入任何特定内容并且可能碰巧存在任何随机值的位置获取 int,例如 0

解决这个问题的方法是将代码修改为 printf("%f", y.beta + p->beta); 正如 chqrlie 所指出的

关于c - 为什么不同的格式说明符会使用 printf 给出不同的输出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34835599/

相关文章:

c++ - libpcap 是否监视发送的数据包?

c - 寻找内存块

c - 为什么在使用指针的函数中更改此数组的值是错误的?

仅使用 C 函数编写简单的 parking 费计算器

c - 在 Ubuntu 上的 graphics.h 中设置窗口大小

c - 如何将此结构放入动态分配的空间中?

c - visual studio 2017 远程 gdb 调试器在哪里?

c - 如何控制 gstreamer 管道中的帧速率?

C 日志库

c - C 中的 "initializer element is not constant char"错误