按位或和赋值

bitwise or and assignment

#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 位的 space。由于某种原因,它不起作用。当我在循环中对 vals 进行赋值时,它似乎只是将读入的当前值存储到 vals 中。您知道可能出了什么问题吗?

一个半途而废的编译器会告诉你:

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 添加到您的编译命令中。它会为你捕捉到这个。

先把vals的类型改成long int,这样至少能存30位,把curVal的类型改成int来匹配scanf打电话。

然后确保你只分配 5 位给 vals:

vals = (vals << SIZE) | ( curVal | 0x1F );

并且当您打印最后一个值时,请使用 按位运算符,因为您只想保留最低有效的 5 位。

printf("%ld", vals & 0x1F );

先生Alpha,如果你想存储 6 个值,for 循环必须 运行 for 6 times.so 你需要 <= in condition as idx<=NUM.... 还有一件事是您在整个程序中没有存储在任何地方。