C语言按位取反【~】详解,含原码反码补码的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;
}