C语言 使用左移和按位 - or 将两个无符号字节组合为单个整数值



我正在读取 2 个字节,它们共同构建了一个unsigned short值,从 0 到 65536。我想将它们组合成一个值,所以在这里我做了什么:

int32_t temp; 
uint8_t buffer[2]; 
.............
temp = (buffer[1] << 8) /* [MSByte]*/| (buffer[0]/* [LSByte]*/);
printf (" %d" ,temp) ;

我仍然在 32767 处溢出。知道为什么吗?

在移位之前将字节转换为 int,即:

((int32_t)buffer[1] << 8) | buffer[0] 

附言:2个字节可以在[0, 65535]范围内存储无符号整数值;您提到的65536的值超出了范围。


完整的测试程序 — 尝试不同的字节值buffer

#include <stdio.h>
#include <stdint.h>
int main()
{
//uint8_t buffer[2] = {255, 0  }; // prints   255
//uint8_t buffer[2] = {255, 127}; // prints 32767
  uint8_t buffer[2] = {255, 255}; // prints 65535
  int32_t temp = ((int32_t)buffer[1] << 8) | buffer[0];
  printf("%d", temp);
}

最新更新