【问题标题】:int8_t variable is always 0 in C language [duplicate]C语言中的int8_t变量始终为0 [重复]
【发布时间】:2017-06-02 02:08:37
【问题描述】:

我正在自学C语言。

我写了下面的代码并执行了。

没想到“第一个”变量是 0,虽然我输入了 4。

你能解释一下为什么会发生这种情况以及如何解决这个问题吗?

代码:

#include <stdio.h>
#include <stdint.h>

int main(void) {
        int8_t first;
        printf("Fist parameter:");
        scanf("%d", &first);

        int8_t second;
        printf("Second parameter:");
        scanf("%d", &second);

        printf("%d * %d == %d\n", first, second, first * second);
        return 0;
}

预期:

Fist parameter:4
Second parameter:5
4 * 5 == 20

实际:

Fist parameter:4
Second parameter:5
0 * 5 == 0

【问题讨论】:

  • 打开编译器的警告并注意它们。
  • 其实那不是重复的。这不是“int8 使用什么格式说明符”的问题,而是一个更有趣的“为什么它会这样工作”的问题。

标签: c


【解决方案1】:

您将%d 格式与scanf 结合使用。 %d 假定与它一起使用的指针指向 int,这通常是一个 32 位的值(尽管在不同的体系结构上它可以是不同的大小)。 int8_t 是一个单字节值。现在,许多计算机都基于 Intel x86 系列处理器,这是一种“小端”架构,这意味着从寄存器存储到内存中的值的低位部分进入存储它的内存块(通常为 4 个字节)。因此,当您的程序将值 5 存储到 second 中时,它实际上存储了 四个字节 的数据,在十六进制中将是 0x0000000505 存储在 second 中,低位 00 存储在 first 中,接下来的两个字节的零覆盖了内存中 first 的“旁边” - 所以,恭喜,你的程序有一个内存覆盖错误!它可能不是致命的,但它就在那里。 :-)

作为实验,尝试将firstsecond 的类型更改为int。我敢打赌它会按预期工作。

祝你好运。

【讨论】:

    【解决方案2】:

    int8_t 更改为int。那么这可能对你有用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-14
      • 2022-01-10
      • 2015-06-16
      • 2015-12-26
      • 2014-06-04
      • 2016-03-13
      相关资源
      最近更新 更多