C语言中int8_t变量始终为0

时间:2017-06-02 02:08:38

标签: c

我自己在学习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

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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

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

祝你好运。