有符号和无符号0按位取反的区别
📅 2026/7/4 10:15:28
👁️ 阅读次数
📝 编程学习
#include <stdio.h> int main() { char a = 0; unsigned char b = 0; a = ~a; b = ~b; printf("The signed 0 is reversed bit by bit:%d\n", a); printf("The unsigned 0 is reversed bit by bit:%d\n", b); return 0; }为什么?
理解如下解释需掌握:正,负数的源码、反码、补码;有符号数的二进制表示。
1. char a = 0 定义了一个有符号变量 "a",值为 0。0 的补码是 0000 0000(为什么要求0的补码?因为"a"为有符号数,有符号数在CPU计算时一律使用的是补码),然后再按位取反,所以 ~a 表达式计算结果为:1111 1111
现在要用 printf() 函数以十进制输出 ~a,则需知道 1111 1111 的源码是多少,计算 1111 1111 的源码:补码 - 1(1111 1111 - 1) 得 反码 1111 1110,然后符号位不变按位取反得源码 1000 0001
所以定义有符号变量 a = 0, 按位取反后,以十进制打印输出结果为 -1(1000 0001)
2. unsigned char a = 0定义了一个无符号变量"a",值为0。变量"a"按位取反为1111 1111。
所以定义无符号变量 a = 0,按位取反后,以十进制打印输出结果为 255(1111 1111)
本文根据自己掌握的知识理解写出,读者如发现错误请指正,我们共同进步,感谢!!!
编程学习
技术分享
实战经验