C语言 03 原码 反码 补码
原码
计算机中所有的数字都是使用 0 和 1 这样的二进制数来进行表示的。
这时如果要存储一个数据,比如十进制的 3,那么就需要使用 2 个二进制位来保存,二进制格式为 11,占用两个位置,称为 2 bit 位。
一般占用 8 个 bit 位表示一个字节(B),2 个字节等于 1 个字,所以一个字表示 16 个 bit 位。
数字的直接二进制表示称为原码。
虽然原码表示简单,但是原码在做加减法的时候,就会出现问题。
以 8 bit 位为例:
1 + (-1)
取原码:
0000 0001
+
1000 0001
=
0000 1010
取十进制:
-2
显然结果应该为 0,-2 的结果是错误的。
为了解决这一问题,引入了反码。
反码
正数的反码是其本身。
负数的反码是其原码符号位不变,其余各位取反。
经过上面的定义,再来进行加减法:
1 + (-1)
原码:
0000 0001
+
1000 0001
反码:
0000 0001
+
1111 1110
=
1111 1111
逆反码(取反):
1000 0000
十进制:
-0
这样虽然结果看起来对了。
但如果 1111 1111 代表 -0,0000 0000 代表 +0。
+0 和 -0 都等于 0。
一个 0 用两个二进制数表示,既浪费也不合理,所以又引入了补码。
补码
正数的补码就是其本身
负数的补码是其原码符号位不变,其余各位取反(得到反码),最后 + 1
再来看上面的运算:
1 + (-1)
原码:
0000 0001
+
1000 0001
反码:
0000 0001
+
1111 1110
补码:
0000 0001
+
1111 1111
=
1 0000 0000
省略高位:
0000 0000
逆补码(本身):
0000 0000
逆反码(本身):
0000 0000
十进制:
0
这样就得到了预期的 0。
可以看出,补码是计算机数字存储和运算的完美解决方案,所以计算机中的数字都是以补码存储。

C 语言使用的也是补码。
取值范围
按照上面原码的定义,可以根据位数推出取值范围。
比如现在一共有 8 bit 位来保存数据,为了表示正负,可以让第一个 bit 位专门来保存符号,这样能够表示的数据范围就是:
- 最小:
1111 1111 => -127 - 最大:
0111 1111 => 127
这里就有个疑问了,我们熟知的 char 占一个字节,也就是 8 bit 位,但它的取值范围是 -128 ~ 127。
-128 是从何而来呢?
计算机中的数字都是以补码存储,则:
-128
二进制:
1 1000 0000
逆补码(-1):
1 0111 1111
逆反码(取反):
1 1000 0000
十进制:
-128
可以看出,补码 -128 的原码也是 -128
由于是用 8 bit 位存储数据,1 1000 0000 所以应该舍弃最高位的 1
由此得到 1000 0000
按照惯性思维,1000 0000 应该为 -0
但前面说了,有了 0 不需要 -0
所以就用 1000 0000 表示 -128 了
这样运算也是不影响结果的:
1 + (-128)
原码:
0000 0001
+
1000 0000
=
1000 0001
逆补码(-1):
1000 0000
逆反码(取反):
1111 1111
十进制:
-127
再来看看代码的运行结果:
#include <stdio.h>
int main() {
char c = -128;
printf("%d", c);
}
-128
#include <stdio.h>
int main() {
char c = -128;
printf("%d", c + 1);
}
-127
由此可以看出计算机正是这样运算的。
C语言 03 原码 反码 补码的更多相关文章
- 「C语言」原码反码补码与位运算
尽管能查到各种文献,亲自归纳出自己的体系还是更能加深对该知识的理解. 本篇文章便是在结合百度百科有关原码.反码.补码和位运算的介绍并深度借鉴了张子秋和Liquor相关文章后整理而出. 目录 ...
- C语言原码反码补码与位运算.
目录: 一.机器数和真值 二.原码,反码和补码的基础概念 三.为什么要使用原码,反码和补码 四.原码,补码,反码再深入 五.数据溢出测试 六.位运算 ...
- C语言学习笔记之原码反码补码
原码:就是我们自己看的,以及机器输出给我们看的 补码:机器永远是以补码的形式将数据保存在计算机中 正数: 原码=反码=补码 负数: 反码:原码的符号位不变,其他位取反 ,1变0 0变1 补码:机器 ...
- Java 原码 反码 补码
本篇文章讲解了计算机的原码, 反码和补码. 并且进行了深入探求了为何要使用反码和补码, 以及更进一步的论证了为何可以用反码, 补码的加法计算原码的减法. 论证部分如有不对的地方请各位牛人帮忙指正! 希 ...
- JAVA:二进制(原码 反码 补码),位运算,移位运算,约瑟夫问题(5)
一.二进制,位运算,移位运算 1.二进制 对于原码, 反码, 补码而言, 需要注意以下几点: (1).Java中没有无符号数, 换言之, Java中的数都是有符号的; (2).二进制的最高位是符号位, ...
- 原码 & 反码 & 补码 & 详解
本篇文章讲解了计算机的原码, 反码和补码. 并且进行了深入探求了为何要使用反码和补码, 以及更进一步的论证了为何可以用反码, 补码的加法计算原码的减法. 论证部分如有不对的地方请各位牛人帮忙指正! 希 ...
- Java学习第五篇:二进制(原码 反码 补码),位运算,移位运算,约瑟夫问题
一.二进制,位运算,移位运算 1.二进制 对于原码, 反码, 补码而言, 需要注意以下几点: (1).Java中没有无符号数, 换言之, Java中的数都是有符号的; (2).二进制的最高位是符号位, ...
- python之计算机硬件基本认知_数据单位_进制间转换_数的原码反码补码
一:计算机硬件基本认知 cpu: 中央处理器. 相当于人的大脑.运算中心,控制中心. 内存: 临时存储数据. 优点:读取速度快,缺点:容量小,造价高,断电即消失. 硬盘: 长期存储数据. ...
- C 标识符, 数据存储形式(原码,反码,补码)
一. 标识符 第一个字母必须是英文字母或下划线 二. 数据存储形式(补码存储) 最高位是符号位 ---- 0表示整数 ; 1 表示负数 1. 正数:原码 = 反码 = 补码 例子 : (10) 原码 ...
- java基础知识-原码,反码,补码
1.正数:原码,反码,补码:都一样. 2.负数:和正数的储存方式不同,负数都是以补码形式存储的. <1>负数的补码 把负数的原码除了符号位取反后再+1. <2>负数的原码 把对 ...
随机推荐
- 【LeetCode二叉树#05】平衡二叉树
力扣题目链接(opens new window)](https://leetcode.cn/problems/balanced-binary-tree/) 给定一个二叉树,判断它是否是高度平衡的二叉树 ...
- 公开的Webservice集锦
备注:以下所有的来自 互联网,版权归原作者所有 股票行情数据 WEB 服务(支持香港.深圳.上海基金.债券和股票:支持多股票同时查询) Endpoint: http://webservice.webx ...
- C++ 派生类对象的构造与析构过程
C++ 派生类对象的构造与析构过程 因为基类的成员变量和派生类的成员变量在内存中的连续的(下面程序会验证这一点),如下图所示: 所以构造派生类对象的时候,构造成员变量的过程就像入栈一样: 那么很自然, ...
- python面向对象(基础)
一 面向对象介绍 面向过程: 核心是:"过程"二字 过程的终极奥义就是将程序流程化 过程是"流水化",用来分步骤解决问题的 面向对象: 核心是"对象& ...
- 深入分析Java中的PriorityQueue底层实现与源码
本文分享自华为云社区<滚雪球学Java(70):深入理解Java中的PriorityQueue底层实现与源码分析>,作者: bug菌. 环境说明:Windows 10 + IntelliJ ...
- Java22重磅发布!!!!卷不动了,真的卷不动了。。。。
就在3月19日,Java22重磅发布.Java22新增了12项增强功能,其中包括七个预览特性和一个孵化器特性,这些功能都显著到足以引起JDK增强提案(JEPs)的关注.它们涵盖了Java语言.其API ...
- 【FastDFS】面试官:如何实现文件的大规模分布式存储?(全程实战)
写在前面 在<[FastDFS]小伙伴们说在CentOS 8服务器上搭建FastDFS环境总报错?>一文中,详细的介绍了如何在CentOS 8服务器行搭建FastDFS环境.在生产环境中, ...
- C# 按指定宽高缩放图片
/// <summary> /// 按指定宽高缩放图片 /// </summary> /// <param name="image">原图片&l ...
- CornerNet-Lite:CornerNet粗暴优化,加速6倍还提点了 | BMVC 2020
论文对CornerNet进行了性能优化,提出了CornerNet-Saccade和CornerNet-Squeeze两个优化的CornerNet变种,优化的手段具有很高的针对性和局限性,不过依然有很多 ...
- KingbaseES 查询优化消除SubPlan
说明: 日常业务系统在使用SQL语句进行查询时,开发人员容易将sql查询的子查询放到select语句中进行使用,会造成sql性能的下降. 数据准备: test=# test=# select coun ...