【发布时间】:2019-08-05 23:28:32
【问题描述】:
我试图让 C 将倒转无符号整数解释为无符号整数。 如何在不将 C 解释为二进制补码的情况下反转无符号数的位?
每当我有一个无符号整数并将其用作按位非运算符的操作数时,它根据二进制补码计算为负数。但是根据定义我使用的是无符号整数,一个不应该有符号的数字。
下面是我的沙盒代码。我目前使用的是 GCC 版本 9.1.1。
#include <stdio.h>
#include <stdint.h>
int main(){
uint8_t x = 1;//0000 0001
printf("NOT(%d) == %d", x, ~x);//1111 1110
}
我想要 254 (1111 1110) 的输出,但 C 将该值解释为二进制补码,所以我得到 -2。有没有办法让 C不将倒置字节解释为二进制补码?
【问题讨论】:
-
你告诉它把数字解释为用“%d”签名。使用“%u”。
-
实际上这是未定义的行为,因为格式说明符与提供的类型不匹配,另外大小也不匹配......很可能,
uint8_t需要%hhu格式说明符;更安全的是使用来自<inttypes.h>header 的适当宏。 -
@LeeDanielCrocker:这将打印 4294967294 或与
unsigned int宽度 (UINT_MAX-1) 相对应的类似值,而不是问题所寻求的 254。 -
@Aconcagua:格式说明符没有未定义的行为。整数提升自动将
x提升为int,因此参数x和~x都具有int类型,这是使用%d格式化的正确类型。
标签: c types bit-manipulation unsigned-integer