从计算机中数据类型的存储方式,思考理解原码,反码,补码

从计算机中数据类型的存储方式,思考理解原码,反码,补码

1. 数据类型

首先,我们知道,在C中,设计了两个类型的数据:

  1. 有符号数据类型
  2. 无符号数据类型
==== signed & unsigned 

打印方式: signed: %d, unsigned: %u
数据范围:
signed: [-128, 127]
unsigned: [0, 255]

2. 无符号数据类型 - 原码,反码,补码

在学习计算机的过程中,很快出现了:原码,反码,补码的概念。这里你肯定不会理解为什么要设计这个玩意儿的! 因为你不知道 “有符号数据类型” 在 计算机中是怎么存储的。你需要看下一段。

1. 反码,补码是针对有符号类型的数来讲的,对于unsigned 没有意义;
2. 补码 一般用来表示负数;

对于一个带符号的数字来说,比如:signed int i = 7和 signed int j = -7
正数:(7)(正数首位为0)
原码:0000 0111
补码:0000 0111 (正数的补码等于原码,这个是规定,不要考虑正数是否有反码)

负数:(-7)(负数首位为1)
原码:1000 0111
反码:1111 1000  反码=(对于负数来说,首位不变,其他位反转)
补码:1111 1001

3. 数据的存储:

在这里,你需要理解一下,计算机对有符号数据类型,和无符号数据类型的存储方式不同;

无符号数的存储:

无符号数没有原码,补码之说,直接转换成二进制;

有符号数的存储:

  • 有符号数采用补码的形式存储,无论你是正数还是负数,只要你是有符号数;(重要)
  • 正数的补码,等于其原码
  • 负数的补码,等于反码加1

4. 特殊的0的编码问题

在有符号的数据类型下,0会出现两个表达方式:+0, -0

那么首先,我们看看如果按照其他负数的逻辑,+0 和 -0的反码分别怎么表示?

原则: 对于负数,首位不参与运算,负数的补码等于反码加一;那么,-0的补码等于:1000 0000 +0的补码等于:0000 0000

+0 和 -0
+0:
原码:0000 0000
补码:0000 0000 

-0:
原码:1000 0000
反码:1111 1111
补码:1000 0000 

什么?0 虽然在signed情况下,有两种表达方式(+0,和-0),但是毕竟都是一个数0啊,怎么0可以有两个补码?不允许啊,这台浪费了吧!!!

因此,在不能浪费的理念下,计算机又新增规定:对于0有+0, -0这个特殊情况下,这个时候,最高符号位要参与运算;此时,无论是数字0来说,无论是+0 还是 -0,其补码只有一个,那就是0000 0000;

这个时候,你又会发现,多余了一个1000 0000 没人用吗?怎么办呢? 在计算器中,又出台规定将这个没有用的1000 0000表示-128;

所以,你会看到,对于有符号数,数据存储范围多了一个:-128

数据范围:

  • 有符号数:[-128, 127]
  • 无符号数:[0, 255]

5. 使用补码的好处?

看到了特殊的0的解释之后,你会发现,在有符号数据类型中,使用补码的好处是:

  1. 解决了0的编码问题
  2. 可以多保存一个数:-128, 如signed char 可以多保存一个:-128
  3. 多保存的一个数:-128,没有原码和反码

6. 为什么使用补码来存储数据?

  1. 解决0的编码问题
  2. 减法运算可以转化为加法运算,省去硬件上的减法电路,CPU只需要有:全加器,求补电路

7. 思考 - 为什么设计补码?

规则: 补码 = 反码 + 1

我们已经知道对于“符号类型的数”,他的补码等于反码加一,我们思考一下,这个规则是怎么来的?想明白了,也就明白为什么要设计“补码”了!

首先,我们知道 7的二进制原码是:0000 0111

那么我们思考一下,什么值 和 7 相加等于0?

小学生都知道,答案是:-7,于是,你会发现好几个二级制数字,都能满足这个条件,难道让他们都表示-7吗? 肯定不可能啊!

1111 1001
1111 1010
1111 1100

现在核心思想就在这里,计算机用巧妙之处体现出来了! 计算机想了,既然他们都满足条件,我是不可能让他们都表示为-7的,我要重新设计一个规则,使得,只有一个数满足!于是这个规则就出现了:

先设计一个数,可以和7相加后等于: 1111 1111 , 然后再加1 就等于0了;

所以:

7:
0000 0111   = 1111 1111
+
1111 1000 

所以,-7在存储的时候一定要存成:1111 1001 ,而不是:-7的原码(1000 0111), 那么我们就设计一个概念“补码”, 使得-7的补码等于要存储的值(1111 1001), 从-7的原码到-7的补码就是我们的规则:首位不变,其他位反转成“反码”,然后再加1;

原文地址:https://www.cnblogs.com/muahao/p/10385362.html

时间: 2024-08-05 01:06:34

从计算机中数据类型的存储方式,思考理解原码,反码,补码的相关文章

<13>【了解】计算机中的进制+【理解】原码反码补码基本概念+【理解】为什么要引入反码、补码?+【掌握】位运算符介绍及使用+位运算应用:编程实现10进制转2进制

1 #include <stdio.h> 2 3 int main(int argc, const char * argv[]) { 4 5 //定义10进制数,打印出10.8.16进制的值 6 int a = 13; 7 printf("%d\n",a); 8 printf("%o\n",a); 9 printf("%x\n",a); 10 11 //int 64 4个字节 12 int b = 0b0000000000000000

原码,反码,补码详解及 Java中&gt;&gt;和&gt;&gt;&gt;的区别

前两天分析 HashMap 的 hash 算法的时候,遇见了 >> 和 >>> 这两个符号,当时查了下资料,在脑子中过了一下.今天又碰到了,没想到竟然忘了  0-0........ 我这记忆力哎,不说了.只好做个笔记,提醒自己,遇到啥不会的最好记下来,好记性不如烂博客啊~ 既然涉及到位运算,我们追本索源,就先从最基础的原码,补码和反码学起.搜了一下这方面的资料,发现一篇专门介绍这方面的文章,写的很是透彻,便直接引用过来了,原文地址是:http://www.cnblogs.co

计算机中的原码,反码,补码与移码

在计算机内,定点数有3种表示法:原码.反码和补码. 原码:就是二进制定点表示法,即最高位为符号位,0表示正,1表示负,其余位表示数值的大小 反码:正数的反码与其原码相同:负数的反码是对其原码逐位取反,但符号位除外.       原码10010=反码11101(10010,1为符号位,故为负) 补码:正数的补码与原码相同,负数的补码是对其原码逐位取反,但符号位除外,然后整个数加1 如果补码的符号位为0,则表示一个正数,其原码就是补码如果补码的符号位为1,则表示一个负数 移码:移码与补码的关系: [

二进制中的原码反码补码

二进制中的原码.反码.补码 1. 原码 原码就是符号位加上真值的绝对值, 即用第一位表示符号, 其余位表示值. 比如如果是8位二进制: [+1]原 = 0000 0001 [-1]原 = 1000 0001 第一位是符号位. 因为第一位是符号位, 所以8位二进制数的取值范围就是: [1111 1111 , 0111 1111] 即 [-127 , 127] 原码是人脑最容易理解和计算的表示方式. 2. 反码 反码的表示方法是: 正数的反码是其本身 负数的反码是在其原码的基础上, 符号位不变,其余

c语言中的原码,补码,反码的小结。

1.正数(符号位为0)的原码=反码=补码. 2.负数(符号位为1)由原码到补码:原码符号位1不变(即先求绝对值的原码,将符号位变为1),其余取反,得到反码,再加1,得到补码. 重点:补码的表示方式有8位2进制,16位,32位,64位,这与c语言关键字表示的数值范围有关系. 3.对一个整数的补码再求补码,等于该整数自身. 4.模的概念:略. 例子:时钟的计量范围为0到11,模为12.表示n位计算机计量范围为0到2^(n)-1,模为2^(n).        在以模为12的系统中,加8和减4效果都是

JavaScript两种数据类型的存储方式

JavaScript中数据类型的存储 区别: 两种类型的区别是:存储位置不同 基本数据类型 原始数据类型是直接存储在栈(stack)中的简单数据段.因为占据空间小.大小固定,属于被频繁使用数据,所以放入栈中存储. 引用数据类型 引用数据类型存储在堆(heap)中的对象,占据空间大.大小不固定.如果存储在栈中,将会影响程序运行的性能. JavaScript中的引用数据类型有: Array Object 引用数据类型是保存在堆内存中的,然后再栈内存中保存一个对堆内存中实际对象的引用(栈内存中保存了一

Android笔记——Android中数据的存储方式(二)

我们在实际开发中,有的时候需要储存或者备份比较复杂的数据.这些数据的特点是,内容多.结构大,比如短信备份等.我们知道SharedPreferences和Files(文本文件)储存这种数据会非常的没有效率.如果学过JavaWeb的朋友,首先可能想到的是数据库.当然了数据库是一个方案,那么是否还有其他的解决方案呢?今天我们在讲下Android笔记——Android中数据的存储方式(一) 提到的除了SharedPreferences和Files(文本文件)以外的其他几种数据储存方式:xml文件.SQL

java变量、二进制、数据类型、方法、原码、补码、反码

1. 变量  1. 他 她 我 你 某人 佚名 旺财 X-man x = 1     您好! 它    (变量就是自然语言中的代词)  2. int age = 15;// 00000000 00000000 00000000 00001111   3. Java 中的变量     a Java是强类型语言,     b 变量必须声明,并且初始化以后使用     c 变量必须有明确的类型     d 变量不能重复定义  4. 变量的作用域     a 在声明的地方开始,到块结束为止     b

关于原码、补码、反码的理解

补下基础 -- 原码.补码.反码 -- 正数补码.反码都和原码一样, 符号位为0 -- 负数原码  符号位为1,其他位为 绝对值表示的二进制数 反码  原码符号位不变.其他位按位取反 补码 反码 + 1 反码的问题是 00000000 为0, 反码为 00000000 10000000 也为0, 反码为 11111111 这样0就有两个反码,   11111111 -127反码为 1000000 补码  反码 + 1 所以 10000000为0  反码为11111111 补码为反码+1 => 0