【发布时间】:2020-04-24 14:02:17
【问题描述】:
我的理解是,对常规 ol' short/int/long 类型的某些按位运算要么是依赖于实现的( | & ~ >> ),要么是未定义的(
但是,C99 引入了固定宽度的整数类型,并且明确地将它们定义为没有填充位的二进制补码精确位。
这是否意味着所有按位运算对于这些类型在提供它们的平台之间都是明确定义和可移植的?
例如,这个 Works on My Machine™,但它是否保证可以工作?
#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;
}
【问题讨论】:
-
请注意,
x << n仅在x < 0或n < 0或n >= CHAR_BIT * sizeof x时是未定义的行为。 -
@MarcoBonelli 不同意is undefined behavior only if ....。它也是带有符号正数
x的 UB,并且移位后的值无法在结果类型中表示。 -
@chux-ReinstateMonica 呵呵,你是对的,忘记了操作数可以有不同类型的事实。哦,男孩,每个角落后面真的有UB......
标签: c language-lawyer