gpt4 book ai didi

c - 为什么 'vals' 在这个 while 循环的每次迭代中都被重置为零?

转载 作者:太空宇宙 更新时间:2023-11-04 00:29:23 25 4
gpt4 key购买 nike

我正在编写一些代码将小整数值打包成一个常规 int

#include <stdio.h>

#define NUMVALS 6
#define SIZE 5
#define MAX 31

int main() {
int vals = 0;
short curVal, idx = 0;

while(idx != NUMVALS) {
scanf("%d",&curVal);
printf("Vals pre shift: %.8X\n",vals);
vals <<= SIZE;
printf("Vals post shift: %.8X\n",vals);
vals |= curVal;
printf("Vals post new set:%.8X\n\n",vals);
idx++;
}

当我用输入字符串运行这个小检查时

1 2 3 4 5 6

我得到类似这样的输出

Vals pre shift: 00000000
Vals post shift: 00000000
Vals post new set:00000001

Vals pre shift: 00000000
Vals post shift: 00000000
Vals post new set:00000002

对于所有六个。为什么 vals 在每个循环中都重置为零?它看起来不像是我在触摸它,但显然有什么东西正在重置它。

最佳答案

您在 scanf 中使用了错误的格式说明符.这会导致未定义的行为。一种可能是 scanfcurVal 的 2 字节位置写入 4 个字节, 而“额外”的 2 个字节被破坏了 vals .

对于 short , 使用 %hd .另一种选择是更改 curVal成为int .


另一个潜在的问题是 vals <<= SIZE; .转移 1进入符号位也会导致未定义的行为。它在普通系统上可能表现得大致正常,但都是一样的,它很容易通过制作 vals 来修复。有类型 unsigned int .

关于c - 为什么 'vals' 在这个 while 循环的每次迭代中都被重置为零?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33227761/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com