#include <stdio.h>
#define NUMVALS 6
#define SIZE 5
#define MAX 31
int main () {
int vals = 0;
short curVal, idx = 0;
for(; idx < NUMVALS; ++idx) {
scanf("%d", &curVal);
vals = (vals << SIZE) | curVal;
}
printf("%d", vals | curVal);
return 0;
}
这是我正在处理的一些代码。它应该存储6个整数,每个整数在0到31的范围内,因此每个整数得到5位的空间。由于某种原因,它无法正常工作。当我在循环中对val进行赋值时,它似乎只是将读入的当前值存储到val中。你看到可能出现的问题吗?
答案 0 :(得分:4)
中途不错的编译器会告诉你:
warning: format ‘%d’ expects argument of type ‘int *’, but argument 2 has type ‘short int *’
scanf("%d", &curVal);
您需要使用%hd
来扫描short
,或者(在这种情况下更好)将变量更改为int
。
如果您正在使用GCC,请将-Wall -Wextra -Werror
添加到编译命令中。它会为你抓住这个。
答案 1 :(得分:1)
首次更改vals
到long int
的类型,因此它可以存储至少30位和curVal
到int
的类型以匹配scanf调用。
然后确保只将5位分配给vals
:
vals = (vals << SIZE) | ( curVal | 0x1F );
当您打印最后一个值时,请使用和按位运算符,因为您只想保留最低5位。
printf("%ld", vals & 0x1F );
答案 2 :(得分:-1)
先生。 Alpha,如果你想存储6个值,for循环必须运行6次。所以你需要&lt; =条件为idx&lt; = NUM .... 还有一件事是你不是通过程序在任何地方存储。