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

时间:2015-10-20 04:01:21

标签: c

我正在编写一些代码来将小整数值打包到常规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每个循环重置为零?它看起来并不像我触摸它,但显然有些东西正在重置它。

1 个答案:

答案 0 :(得分:8)

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

对于short,请使用%hd。另一种选择是将curVal更改为int

另一个潜在的问题是vals <<= SIZE;。将1移入符号位也会导致未定义的行为。它可能在普通系统上表现得非常理智,但同样,通过使vals具有类型unsigned int可以轻松修复它。