您正在使用有符号整数。如果您使用无符号整数(如果整数只有 4 位,则不是),您的预期结果 (14) 会出现。
相反,对于有符号整数,所有设置最高位的值都是负值——这就是二元补码的工作原理。例如,如果您有 16 位,则0b0000_0000_0000_0000
通过值0b0111_1111_1111_1111
分配给正值(“0”到“32767”),同时将值分配给负值(“-32768”到“-1”)0b1000_0000_0000_0000
。0b1111_1111_1111_1111
还有,int
通常是4位以上;它通常是 32 位的。1 的否定是0b1111_1111_1111_1111_1111_1111_1111_1110
,不是0b1110
。
0b1111_1111_1111_1111_1111_1111_1111_1110
当被视为有符号整数时,-2
使用二进制补码规则。
0b1111_1111_1111_1111_1111_1111_1111_1110
当被视为无符号整数时4,294,967,294
,等于2^32 - 2
。
#include <stdio.h>
#include <cstdint>
// Program prints the following:
// unsigned int_8: 254
// signed int_8: -2
// unsigned int_16 65534
// signed int_16 -2
// unsigned int_32 4294967294
// signed int_32 -2
int main() {
printf( "unsigned int_8: %hhu\n", (uint8_t)~1 );
printf( "signed int_8: %d\n", (int8_t)~1 );
printf( "unsigned int_16 %hu\n", (uint16_t)~1 );
printf( "signed int_16 %d\n", (int16_t)~1 );
printf( "unsigned int_32 %u\n", (uint32_t)~1 );
printf( "signed int_32 %d\n", (int32_t)~1 );
}