`
talentluke
  • 浏览: 600873 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

计算机中的原码、反码和补码

 
阅读更多
大家都知道数据在计算机中都是按字节来储存了,1个字节等于8位(1Byte=8bit),而计算机只能识别0和1这两个数,所以根据排列,1个字节能代表256种不同的信息,即28(0和1两种可能,8位排列),比如定义一个字节大小的无符号整数(unsigned char),那么它能表示的是0~255(0~28-1)这些数,一共是256个数,因为,前面说了,一个字节只能表示256种不同的信息。别停下,还是一个字节的无符号整数,我们来进一步剖析它,0是这些数中最小的一个,我们先假设它在计算机内部就用8位二进制表示为00000000(从理论上来说也可以表示成其他不同的二进制码,只要这256个数每个数对应的二进制码都不相同就可以了),再假设1表示为00000001,2表示为00000010,3表示为00000011,依次类推,那么最大的那个数255在8位二进制中就表示为最大的数11111111,然后,我们把这些二进制码换算成十进制看看,会发现刚好和我们假设的数是相同的,而事实上,在计算机中,无符号的整数就是按这个原理来储存的,所以告诉你一个无符号的整数的二进制码,你就可以知道这个数是多少,而且知道在计算机中,这个数本身就是以这个二进制码来储存的。比如我给你一个2个字节大小的二进制码,首先声明它表示的是无符号的整数:00000000 00000010,我们把前面的0省略,换算一下,它表示的也是数值2,和前面不同的是,它占了2个字节的内存。不同的类型占的内存空间不同,如在我的电脑中char是1个字节,int是4个字节,long是8个字节(你的可能不同,这取决于不同的计算机设置),它们的不同之处仅仅是内存大的能表示的不同的信息多些,也就是能表示的数范围更大些(unsigned int能表示的范围是0~28*4-1),至于怎么算,其实都是一样的,直接把二进制与十进制相互转换,二进制就是它在计算机中的样子,十进制就是我们所表示的数。啊哈,原来这些都是可以计算的呀,我曾经还以为不同的计算机储存的原理是不同的,取决于商家的喜好呢,呵呵。说了这么多怎么还没有提到原码、反码和补码呀,别急别急,心急吃不了热豆腐,呵呵,因为无符号的整数根本就没有原码、反码和补码。(啊,那不是被欺骗了,5555````我告诉妈妈去,哥哥欺负我)都说了别急嘛,你就不想想我说了这么半天的无符号整数,那么有符号的整数怎么办啊?

  呵呵,对,只有有符号的整数才有原码、反码和补码的!其他的类型一概没有。虽然我们也可以用二进制中最小的数去对应最小的负数,最大的也相对应,但是那样不科学,下面来说说科学的方法。还是说一个字节的整数,不过这次是有符号的啦,1个字节它不管怎么样还是只能表示256个数,因为有符号所以我们就把它表示成范围:-128-127。它在计算机中是怎么储存的呢?可以这样理解,用最高位表示符号位,如果是0表示正数,如果是1表示负数,剩下的7位用来储存数的绝对值的话,能表示27个数的绝对值,再考虑正负两种情况,27*2还是256个数。首先定义0在计算机中储存为00000000,对于正数我们依然可以像无符号数那样换算,从00000001到01111111依次表示1到127。那么这些数对应的二进制码就是这些数的原码。到这里很多人就会想,那负数是不是从10000001到11111111依次表示-1到-127,那你发现没有,如果这样的话那么一共就只有255个数了,因为10000000的情况没有考虑在内。实际上,10000000在计算机中表示最小的负整数,就是这里的-128,而且实际上并不是从10000001到11111111依次表示-1到-127,而是刚好相反的,从10000001到11111111依次表示-127到-1。负整数在计算机中是以补码形式储存的。
正数原码的符号位为0,负数符号位为1,有效位部分用二进制的绝对值表示。也就是说正负数的原码的区别就只在符号位。
正数的反码和原码相同, 负数的反码为负数原码符号位不变, 其他各位按位取反。
正数的补码和原码相同,负数的补码为反码末位加1.也就是负数补码是负数原码符号位不变,其他各位取反,末位加1.
如8位表示的-1的原码是10000001,那么-1的反码就是11111110,而补码就是在反码的基础上加1,即-1的补码是11111110+1=11111111,因此我们可以算出-1在计算机中是按11111111储存的。总结一下,计算机储存有符号的整数时,是用该整数的补码进行储存的,0的原码、补码都是0,正数的原码、补码可以特殊理解为相同,负数的补码是它的反码加1。下面再多举几个例子,来帮助大家理解!

十进制 → 二进制  
47   → 101111

有符号的整数    原码    反码    补码
  47      00101111  00101111  00101111(正数补码和原码相同)
 -47      10101111  11010000  11010001(负数补码是在反码上加1)


再举个例子,学C语言的同学应该做过这道题:
把-1以无符号的类型输出,得什么结果?(程序如下)

#include<iostream.h>
void main()
{
 short int n=-1;
 cout<<(unsigned short int)n<<endl;
}

  首先在我的电脑中short int类型的储存空间是2个字节,你的可能不同,我说过,这取决于你的计算机配置。它能储存28*2=65536个不同的数据信息,如果是无符号那么它的范围是0~65535(0~216-1),如果是有符号,那么它的范围是-32768~32767(-215~215-1)。这道题目中,开始n是一个有符号的短整型变量,我们给它赋值为-1,根据我们前面所说的,它在计算机中是以补码11111111 11111111储存的,注意前面说了是2个字节。如果把它强制为无符号的短整型输出的话,那么我们就把刚才的二进制把看成无符号的整型在计算机中储存的形式,对待无符号的整型就没有什么原码、反码和补码的概念了,直接把11111111 11111111转化成十进制就是65535,其实我们一看都是一就知道它是范围中最大的一个数了。呵呵,就这么简单。你个把上面的源代码编译运行看看,如果你的电脑short int也是两个字节,那就会和我得一样的结果。你可以先用这个语句看看:cout<<sizeof(short int)<<endl;看看你的电脑里的短整型占多少的储存空间,也可以用sizeof来看其它任何类型所分配的储存空间。

  最后提醒一句,关于数据如何在计算机中储存的,这里只适用于整型的数据,对于浮点型的是另一种方式.
 
下面是我实验用的数据(我用的是32位系统)

 int intA = -1;
 int intB = -127;
 int intC = -128;
 int intD = 0;
 int intF = 1;
 int intE = 127;

反汇编代码如下:

 int intA = -1;
0041152E  mov         dword ptr [ebp-8],  0FFFFFFFFh  (1111 1111)
 int intB = -127;
00411535  mov         dword ptr [ebp-14h],0FFFFFF81h  (1000 0001)
 int intC = -128;
0041153C  mov         dword ptr [ebp-20h],0FFFFFF80h  (1000 0000)
 int intD = 0;
00411543  mov         dword ptr [ebp-2Ch],0
 int intF = 1;
0041154A  mov         dword ptr [ebp-38h],1
 int intE = 127;
00411551  mov         dword ptr [ebp-44h],7Fh

分享到:
评论

相关推荐

    计算机基础知识:原码反码补码练习(含答案)

    计算机基础知识在IT领域至关重要,尤其是对于理解计算机内部...了解这些基础知识对于进行计算机编程、内存管理、硬件设计等IT工作都非常重要,特别是在处理数值运算时,理解和应用原码、反码和补码的概念是至关重要的。

    原码反码补码讲课.pptx

    原码反码补码讲课 计算机中的数值表示是计算机基础知识的重要组成部分。在计算机中,数值可以分为整数和实数两大类。整数又可以分为无符号整数和带符号整数。无符号整数是指不带符号的整数,而带符号整数则是带有...

    原码、反码、补码三码转换(C#)

    在计算机科学中,原码、反码和补码是用于表示二进制数值,特别是负数的三种方式。本文将详细讲解这三种编码方式,并通过C#编程语言演示如何进行三码之间的转换。 1. 原码(Direct Code): 原码是最直观的二进制...

    计算机原码,反码,补码.pdf

    计算机原码、反码和补码是计算机中对数字的表达方式。机器数是计算机中数字的表现形式,分为正负两类,通过最高位(符号位)来表明其正负,其中0表示正数,1表示负数。 原码是计算机中最原始的数字表达方式,第一个...

    原码反码补码PPT学习教案.pptx

    原码反码补码是计算机系统中最基本的概念之一,了解原码反码补码的原理和应用对于计算机科学和技术的学习非常重要。本资源摘要信息将对原码反码补码的概念、特点和应用进行详细的介绍。 一、机器数与真值 机器数是...

    补码源码反码转换工具,补码反码原码的转换工具,C/C++

    在计算机科学中,二进制表示的数字有三种主要形式:原码、反码和补码,主要用于表示有符号整数。本项目是基于C++的MFC(Microsoft Foundation Classes)框架实现的一个实用工具,旨在帮助用户理解并进行原码、反码和...

    整数的原码,反码和补码

    综上所述,原码、反码和补码是计算机内部表示有符号整数的重要方式,它们各有特点和适用场景,其中补码因其算术运算的简便性而在现代计算机体系结构中占据了主导地位。理解这些编码方式对于深入学习计算机组成原理和...

    原码、反码、补码

    - **负数**的原码、反码和补码不同,其中补码是通过对原码取反后加1得到的。 - 补码的主要优点在于简化了计算机内部的运算逻辑,使得减法可以转化为加法运算。 了解这些概念对于理解计算机内部的数值表示和运算机制...

    原码反码补码说课.pptx

    "原码反码补码说课.pptx" 本资源是关于计算机组成原理的教学课件,主要讲解了原码、反码和补码的概念、计算方法和表示范围。该课件旨在培养学生实事求是的学风、耐心细致的工作作风和严谨的工作态度。 一、知识...

    数字的原码、反码和补码

    负数的补码就是对反码加一,而正数不变,正数的原码反码补码是一样的。在补码中用(-128)代替了(-0),所以补码的表示范围为:(-128~0~127),共 256 个。注意:(-128) 没有相对应的原码和反码,(-128) = ...

    原码、反码、补码、移码与浮点.doc

    原码、反码、补码、移码是计算机科学中用于表示数字的编码方式,浮点数是一种特殊的数值表示方式。本文将对原码、反码、补码、移码进行详细的介绍,并对浮点数的表示方式进行讨论。 一、原码、反码、补码、移码的...

    原码,反码,补码详解及原理.docx

    原码、反码和补码是计算机中用来表示有符号整数的重要概念,它们主要用于二进制数的存储和计算,特别是在计算机硬件中简化运算过程。以下是对这些概念的详细解释: 1. **原码**: 原码是最直观的表示方式,直接在...

    机器数, 真值, 原码, 反码, 补码 详解

    本文主要探讨了机器数、真值以及原码、反码和补码这三种在计算机中表示有符号整数的关键概念。 首先,机器数是计算机中用于表示数值的二进制形式,包括符号位。在有符号数中,最高位通常作为符号位,0代表正数,1...

    16进制(4位)到二进制原码、反码、补码计算

    16进制(4位)到二进制原码、反码、补码计算

    学习原码, 反码和补码之前, 需要先了解机器数和真值的概念

    学习原码、反码和补码之前,需要先了解机器数和真值的概念 ...原码、反码和补码是机器存储一个具体数字的编码方式,了解它们的基础概念和计算方法对于计算机的运算设计和计算机科学的发展非常重要。

    二进制转原码反码补码 C语言源码

    /* *功能实现任意二进制数的原码 反码 补码转换 *仅仅是字符串的操作,没有进行数字操作 *对-0的操作可能有问题 *ssfshine@gmail.com */

    计算机原理原码、反码、补码.docx

    计算机原理中,整数的表示方式有三种:原码、反码和补码。这些概念都是为了解决整数在计算机中的表示和存储问题。 首先,让我们来了解一下整数在计算机中的表示范围。一个字节的整数表示范围为[0, 255],即2^8-1。...

    原码反码补码图解.

    原码反码补码图解.原码反码补码图解.原码反码补码图解.

    原码反码和补码PPT学习教案.pptx

    计算机中的数字表示是一个关键概念,尤其在理解计算机底层工作原理时。...同时,通过原码、反码和补码之间的转换,可以方便地进行数值的表示和计算。掌握这些基本概念对于理解和编程计算机系统至关重要。

Global site tag (gtag.js) - Google Analytics