我正在编写一些代码来将小整数值打包到常规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每个循环重置为零?它看起来并不像我触摸它,但显然有些东西正在重置它。
答案 0 :(得分:8)
您在scanf
中使用了错误的格式说明符。这会导致未定义的行为。一种可能性是scanf
将4个字节写入curVal
的2字节位置,而“额外”2个字节写入vals
。
对于short
,请使用%hd
。另一种选择是将curVal
更改为int
。
另一个潜在的问题是vals <<= SIZE;
。将1
移入符号位也会导致未定义的行为。它可能在普通系统上表现得非常理智,但同样,通过使vals
具有类型unsigned int
可以轻松修复它。