是否定义了按位操作并将其移植到带符号的固定宽度整数上?

我的理解是,对常规ol'short / int / long类型的某些按位运算要么是实现相关的(|&〜>>),要么是未定义的(<<)

但是,C99引入了固定宽度的整数类型,并将它们明确定义为没有填充位的二进制补码精确位。

这是否意味着对于提供这些操作的平台中的那些类型,所有按位操作都定义明确且可移植?

例如,这可以在“我的机器”上使用,但是否保证可以使用?

#include <inttypes.h>
#include <stdio.h>

int main() {
  uint16_t a = 0xffff;
  int16_t b = *(int16_t*)(&a);

  printf("%" PRId16 "\n", b);

  // Prints '-1'

  b <<= 4;

  printf("%" PRId16 "\n", b); 

  // Prints '-16'

  return 0;
}
评论