C语言按位取反【~】详解,含原码反码补码的0基础讲解【原码反码补码严格意义上来说属于计算机组成原理的范畴,不过这也是学好编程初级阶段的必修课】

发布于:2025-02-10 ⋅ 阅读:(70) ⋅ 点赞:(0)

目录

概述【适合0基础看的简要描述】:

上述加粗下划线的内容提取版:

从上述概述中提取的核心知识点,需背诵:

整数【包含整数,负整数和0】的原码反码补码相互转换的过程图示:

过程详细刨析:

运行结果展示:


概述【适合0基础看的简要描述】:

整型的表示方法:原码,反码,补码
正整数的符号位为0,负整数的符号位为1
正整数的原码=反码=补码;
负整数的原码先写出来,符号位不变,其他位按位取反就可以得到反码,反码+1即可得到补码。
进行运算或者赋值时,输入的都是十进制数,转换成二进制即为该数的原码,再转换成补码就可以进行赋值或运算了,赋值或运算结束后,将补码转换成原码,最后将补码转换成十进制就是最终的结果了。

上述加粗下划线的内容提取版:

十进制 -> 二进制源码 -> 二进制补码 -> 按位取反 -> 二进制原码 -> 十进制


从上述概述中提取的核心知识点,需背诵:

按位取反:对一个数的二进制补码进行取反。(0转1,1转0)。

原码:在数值前面增加一位符号位,0表示正数,1表示负数。

反码:正数的反码与原码相同;负数的反码对其原码逐位取反(符号位除外)。

补码:正数的补码与其原码相同;负数的补码是在其反码的末位+1。


整数【包含整数,负整数和0】的原码反码补码相互转换的过程图示:


过程详细刨析:

//按位取反【~】【cout函数默认整型是int,(由于int整型是占4个字节的,相当于32个bit位(不算符号位),所以二进制一共有32位数值位+最左边的一位符号位【符号位若为0代表数的十进制是个非负数,符号位若为1代表数的十进制是个正数】)】
#include<iostream>
using namespace std;
int main() {
	cout << (~0) << endl;
	//0存储在内存中:
	// 0b 0 00000000 00000000 00000000 00000000  【0的原码=反码=补码】【从左往右数第一位是符号位】
	// 0b 0 00000000 00000000 00000000 00000000    【0的补码】
	// ~0【0按位取反的过程:】 
	// 0b 1 11111111 11111111 11111111 11111111  0的补码按位取反后的结果【从左往右数第一位是符号位,进行按位取反时,符号位也要取反】
	// 0b 1 11111111 11111111 11111111 11111110  补码-1=反码
	// 0b 1 00000000 00000000 00000000 00000001  反码取反=原码
	// 所以0的按位取反结果是-1
	
	//求一个数的相反数【(按位取反x)+1=(-x)】
	int a = 16;
	cout << (~a) + 1 << endl;
	// ~16【按位取反16的过程:(简略写:省略了一部分数值位,详细的看上面0的按位取反)】
	// 0b 0 10000  16的原码=反码=补码
	// 0b 1 01111  16的补码按位取反=~16的补码
	// 0b 1 01110  ~16的反码
	// 0b 1 10001  ~16的原码
	// ~16=-17
	// (~16+1)=-16
	return 0;
}

运行结果展示:


网站公告

今日签到

点亮在社区的每一天
去签到