c语言。0按位取反是1还是-1,1按位取反是0吗?

Python016

c语言。0按位取反是1还是-1,1按位取反是0吗?,第1张

i为int类型 通常占4个字节

0的原码:0000 0000 0000 0000 0000 0000 0000 0000

取反: 1111 1111 1111 1111 1111 1111 1111 1111

最高位是1所以是负数,求其原始数据,方法是

再次取反加1(符号位不变)

取反:     1000 0000 0000 0000 0000 0000 0000 0000

加1          1000 0000 0000 0000 0000 0000 0000 0001

所以是 -1

Java使用补码表示二进制数,在补码表示中,最高位为符号位,正数的符号位为0,负数为1。

补码的规定如下:对正数来说,最高位为0,其余各位代表数值本身(以二进制表示),如+42的补码为00101010。对负数而言,把该数绝对值的补码按位取反,然后对整个数加1,即得该数的补码。如-42的补码为11010110(00101010按位取反11010101+1即11010110)用补码来表示数,0的补码是唯一的,都为00000000。(而在原码,反码表示中,+0和-0的表示是不唯一的,可参见相应的书籍)。而且可以用111111表示-1的补(这也是补码与原码和反码的区别)。

整数-1在计算机中用16进制的表示:

1、先取1的原码:

00000000 00000000 00000000 00000001

2、得反码:

11111111 11111111 11111111 11111110

3、得补码:

11111111 11111111 11111111 11111111

所以,-1在计算机里用16进制为:0xFFFFFF。

我们用“色彩精灵软件”就可以看到:

HTML值:#FFFFFF 就是白色,

此时的三基色数值为: 红 255 绿 255 兰 255。

C语言中的整数一般使用三种基本的编码方式——原码、反码、补码。其中原码取反加1即是补码。举个例子就明白了,以8位二进制为例,求-1的原码、反码、补码。-1的原码:1000 0001,最高位是符号为,1表示负数,0表示正数。-1的反码:1111 1110, 按位取反是除符号位以外,其它每个位上的0变成1,1变成0。-1的补码:1111 1111,在反码的基础上是加上1即为补码。所以,此时-1的补码即为255。