我自己在学习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
答案 0 :(得分:0)
将int8_t
更改为int
。那么这对你有用。
答案 1 :(得分:0)
您将%d
格式与scanf
一起使用。 %d
假设它所使用的指针指向int
,它通常是32位值(尽管在不同的体系结构上它可以是不同的大小)。 int8_t
是一个单字节值。现在,如今许多计算机都基于Intel x86系列处理器,这是一种“小端”架构,这意味着从寄存器存储到存储器中的值的低阶部分会进入低阶地址。存储的内存块(通常为4个字节)。因此,当您的程序将值5存储到second
时,它实际上存储了四个字节的数据,以十六进制表示0x00000005
。 05
存储在second
中,低位00
存储在first
中,接下来的两个零字节覆盖了“旁边”{{1}在内存中 - 所以,恭喜你的程序有一个内存覆盖错误!它可能不是致命的,但它就在那里。 : - )
作为实验,请尝试将first
和first
的类型更改为second
。我敢打赌它会按预期工作。
祝你好运。