带你快速了解原码、反码、补码,搞定进制转换
“ 编程基础之原码、反码、补码。”
01
—
前言
冷月最近在准备研究生的复试,更新的内容大多会和C语言相关或者一些编程的基础知识。
很多的小伙伴在学习计算机相关课程的时候,经常会听到原码、反码、补码等词语,但是很少有人能够理解它们具体是干嘛的。但是随着编程的深入,我们知道在计算机中只能存储0和1的二进制码,所有数据类型最后都会转为二进制码再存储到内存中。所以理解这些知识能够帮助你理解数值在内存当中的存储方式。
并且进制转换也是一个重点,不管是在大学的期末考试还是找工作的面试题,这都是需要了解的知识。今天冷月就带大家来梳理一下原码、反码、补码的相关知识,并讲解一下进制转换的方法。
02
—
原码
原码也叫符号-绝对值码;最高位0则表示正数,最高位1则表示负数,其余的二进制位是该数字的绝对值的二进制位。也就是说原码的最高位代表他是正数或者是负数,而其余的位数才代表具体的值。
举个例子: 假如:我们用8位二进制表示一个数,+11的原码为00001011,-11的原码就是10001011
原码简单易懂,但是它的加减运算复杂,而且零的表示不唯一,所以在计算机中并不是直接用数值的原码来存储。
03
—
反码
反码通常是用来由原码求补码或者由补码求原码的过渡码。直接将二进制位按位取反。而反码的运算不遍,也没有在计算机中应用。
假如:我们用8位二进制表示一个数,+11的反码为11110100,-11的原码就是01110100
04
—
补码
在计算机系统中,数值一律用补码来表示和存储。原因在于,使用补码,可以将符号位和数值域统一处理;同时,加法和减法也可以统一处理。
如下图所示:
05
—
8421法
一种2进制转16进制的简便方法。简单来说16进制也就是表示16种状态,而二进制数要表示16种状态,则需要4位才能够表示。所以我们用4位二进制数来表示1位16进制数,不够的位数前面补0。
而对应的4位二进制数分别等于10进制的8 4 2 1。
如下图所示:
06
—
进制转换(求补码)
已知十进制求二进制:
求正整数的二进制(补码):除2取余,直至商为0,余数倒序排列。
求负整数的二进制(补码):先求与该负数相对应的正整数的二进制补码,然后将所有位取反,末尾加1,不够位数时,左边补1。
求零的二进制(补码):全是0。
#include<stdio.h>
/*
公众号:学长冷月
*/
int main(){
printf("%#Xn",18); //输出0X12
printf("%#Xn",-18); //输出0XFFFFFFEE
return 0;
}
我们来分析一下上面的运行情况。我们知道正数的原码、反码、补码相同,在C语言中int类型在内存中分配4个字节,也就是32位。而C语言中不能直接输出二进制,所以我们输出16进制。如下图所示:
已知二进制补码求十进制:
如果首位是0,则表明是正整数,按普通方法来求;如果首位是1,则表明是负整数,将所有位取反,末尾加1,所得数字就是该负数的绝对值;如果全是0,则对应的十进制数字就是0
#include<stdio.h>
/*
公众号:学长冷月
*/
int main(){
printf("%dn",0X12); //输出18
printf("%dn",0XFFFFFFEE); //输出-18
return 0;
}
上面的运行情况就是已知十进制求二进制的逆过程。计算过程如下图:
- Mybatis-update - 数据库死锁 - 获取数据库连接池等待
- 使用Apache Server 的ab进行web请求压力测试
- Spring-AOP实践 - 统计访问时间
- mysql创建定时执行存储过程任务
- MongoDB-基础-limit-skip-sort
- MongoDB-基础-条件操作符
- mongodb-基础-update-remove
- Mybatis-mapper-xml-基础
- 2016.06 第一周 群问题分享
- MongoDB - basic
- spring boot启用tomcat ssl
- HTTP status code
- jackson简单使用,对象转json,json转对象,json转list
- 2016.07 第3周 群问题分享
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- C++核心准则T.144:不要特化函数模板
- 三千字带你搞懂XXL-JOB任务调度平台
- Python-科学计算-pandas-14-df按行按列进行转换
- Python实现扫码工具
- C++核心准则T.150:用static_assert检查类和概念的匹配性
- 初学者也能快速写Python脚本啦——通用功能代码分享
- C++核心准则CPL.1:C++比C更好
- C++核心准则CPL.2:如果你必须使用C,使用C和C++的共同子集,并且使用C++编译器编译C代码
- C++核心准则SF.1:如果你的项目没有正在遵从的其他习惯,为代码文件使用.cpp后缀,为接口文件使用.h后缀
- 群晖NAS搭建测速网站,支持万兆
- 二叉树:你真的会翻转二叉树么?
- C++核心准则SF.2:.h文件一定不能包含对象定义或者非inline函数定义
- Vue.js 源码⽬录设计
- 本周小结!(二叉树)
- extern "c"(2)