C语言中 原码、反码、补码 以及 取反(单目操作符 ~ )(第)

时间:2025-03-08 08:26:40

欢迎大家评论区中指正呀,谢谢大家啦

文章目录

  • 前言:必备知识
  • 一、原码、反码、补码
    • 1、原码
    • 2、反码
    • 3、补码
  • 二、取反 (单目操作符 ~ )
    • 1、数值8
    • 2、数值-8
  • 三、负整数 的 原码、反码、补码
  • 四、正整数 的 原码、反码、补码


前言:必备知识

强调点:1、内存中存储的是 补码,打印显示在电脑屏幕上的是 原码;
2、反码 = 补码 - 1
3、因为计算机中存储是以补码的方式存储,所以我们对一个数取反,要先对它的补码进行取反,然后再求取反后的原码,而不是直接对其原码进行取反。
反码 = 补码 - 1
4、正整数的原码 反码 补码 是一样的;
5、负整数:原码,反码->原码的最高位符号位不变,其余位取反,
补码->反码+1。
6、最高位为1,表示负整数;最高位为0,表示正整数


一、原码、反码、补码

1、原码

原码由二进制原数值部分和符号部分组成
+1010101的原码为01010101,-1010101的原码为11010101,
0:正,1:负

2、反码

正数:反码和原码相同,为符号位加上原数值。
+10010101的反码为010010101
负数:反码为符号位不变加上原数值按位取反。-10010101的反码为101101010

3、补码

正数:补码,原码,反码相同。+110011补码为0110011
负数:补码为符号位加上原数值按位取反后再在最低位加 1,即为反码加 1 。-110011补码为1001101

二、取反 (单目操作符 ~ )

‘~’:单目运算符,对一个数的二进制位 按位取反。
以 8 和 -8 为例:

1、数值8

int main()
{
	int a = 8;
	printf("%d	", ~a);
	return 0;          //输出结果:-9
}
数值 8
原码 0000 0000 0000 1000
反码 0000 0000 0000 1000
补码 0000 0000 0000 1000

因为计算机中存储是以补码的方式存储,所以我们对一个数取反,要先对它的补码进行取反,然后再求取反后的原码,而不是直接对其原码进行取反。

补码取反(此时仍然是补码) 1111 1111 1111 0111(单目运算符~,是对所有二进制位取反)
取反后的反码 1111 1111 1111 0110(反码 = 补码 - 1)
取反后的原码 1000 0000 0000 1001

原码二进制转换为十进制为:-9
故 ~8 = -9

2、数值-8

int main()
{
	int a = -8;
	printf("%d	", ~a);
	return 0;     //输出结果为:7
}
数值 -8
原码 1000 0000 0000 1000
反码 1111 1111 1111 0111
补码 1111 1111 1111 1000
补码取反(此时仍然是补码) 0000 0000 0000 0111
取反后的反码 0000 0000 0000 0110(反码 = 补码 - 1)
取反后的原码 0000 0000 0000 0110 (正数,原码、反码相同)

原码二进制转换为十进制为:7
故 ~(-8) = 7

三、负整数 的 原码、反码、补码

#include<>

int main()
{
	int a = -1;
	printf("%d	", ~a);
	return 0;          //输出结果:0
}

解释:
变量类型 int ,4个字节
-1:
原码:10000000 00000000 00000000 00000001
反码:111111111 111111111 111111111 111111110(符号位不变,其余取反)
补码:111111111 111111111 111111111 111111111 (反码 + 1)

代码中 ~ 是单目运算符:对一个数的二进制位 按位取反

内存中存储的是 补码,按位取反
得到:00000000 00000000 00000000 00000000,这是一个正整数(符号位为0),所以原码、反码、补码是相同的,所以结果为0。
补码取反(此时仍然是补码):00000000 00000000 00000000 00000000
取反后的反码:00000000 00000000 00000000 00000000
取反后的原码:00000000 00000000 00000000 00000000

原码二进制转换为十进制为:0
故 ~(-1) = 0

四、正整数 的 原码、反码、补码

#include<>

int main()
{
	int a = 0;
	printf("%d	", ~a);
	return 0;          //输出结果:-1
}

解释
0:
原码:00000000 00000000 00000000 00000000
反码:00000000 00000000 00000000 00000000
补码:00000000 00000000 00000000 00000000
因为有 ~ ,所有二进制位按位取反
补码取反(此时仍然是补码):11111111 11111111 11111111 11111111
取反后的反码:11111111 11111111 11111111 11111110 (反码 = 补码 - 1)
取反后的原码:10000000 00000000 00000000 00000001

原码二进制转换为十进制为:-1
故 ~0 = -1