在"uint8_t | (uint8_t << 8)"中是否有处理整数提升的不同方式?

Is there a different way integer promotion will be handle in "uint8_t | (uint8_t << 8)"?

本文关键字:lt uint8 方式 整数 是否 处理      更新时间:2023-10-16

在下面的程序中,似乎a[1]被移位了八位,然后变为0,打印值应该是1。但实际上发生了整数提升,b的打印值为257。我正在x86-64上运行gcc版本4.8.2。

问题是:如果不通过更改处理器和编译器(处理器选项仅限于x86、x86-64和所有ARM)来更改代码,是否会以不同的方式处理整数提升,从而使打印值不是257?

#include<stdio.h>
#include<stdint.h>
#include<inttypes.h>
int main(){
  uint8_t *a;
  a = (uint8_t *)malloc(sizeof(uint8_t)*2);
  uint16_t b;
  a[0] = 1; a[1] = 1;
  b = a[0] | (a[1] << 8);
  printf("b = %dn", b);
  return 0;
}

整数提升是否会以不同的方式处理,从而使打印值不是257?

没有。整数提升总是发生,这意味着a[0]a[1]在移位或按位or发生之前都被提升为int

来自规格:

如果int可以表示原始类型的所有值(受比特字段宽度的限制),则该值将转换为int。。。