大家都知道数据在计算机中都是按字节来储存了,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。负整数在计算机中是以补码形式储存的,补码是怎么样表示的呢,这里还要引入另一个概念——反码,所谓反码就是把负数的原码(负数的原码和和它的绝对值所对应的原码相同,简单的说就是绝对值相同的数原码相同)各个位按位取反,是1就换成0,是0就换成1,如-1的原码是00000001,和1的原码相同,那么-1的反码就是11111110,而补码就是在反码的基础上加1,即-1的补码是11111110+1=11111111,因此我们可以算出-1在计算机中是按11111111储存的。总结一下,计算机储存有符号的整数时,是用该整数的补码进行储存的,0的原码、补码都是0,正数的原码、补码可以特殊理解为相同,负数的补码是它的反码加1。下面再多举几个例子,来帮助大家理解!

十进制 → 二进制  (怎么算?要是不知道看计算机基础的书去)
47   → 101111

有符号的整数    原码    反码    补码
  47      00101111  11010000  00101111(正数补码和原码相同)
 -47      00101111  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来看其它任何类型所分配的储存空间。

  最后提醒一句,关于数据如何在计算机中储存的,这里只适用于整型的数据,对于浮点型的是另一种方式,这里我们暂时就不深究了。

源码/反码/补码 (转)相关推荐

  1. 二进制 正数 负数 源码反码补码

     二进制的正负数 . HEX (十六进制) EA                        EA Oct(十进制)      有符号                   无符号 -22       ...

  2. 源码 反码 补码详解(为什么计算机存储数值为补码形式?)

    一. 机器数和真值 在学习原码, 反码和补码之前, 需要先了解机器数和真值的概念. 1.机器数 一个数在计算机中的二进制表示形式,  叫做这个数的机器数.机器数是带符号的,在计算机用一个数的最高位存放 ...

  3. java数字取反_java中源码反码补码与取反的理解

    数字在计算机里是按照二进制来表示的. 箭头朝哪边就是朝哪边移动 补码,反码,和源码 负数原码转化为补码:符号位不变,数值位按位取反,末尾加一. 负数补码转化为原码:符号位不变,数值位按位取反,末尾加1 ...

  4. 2.2.1 定点数的表示 原码 反码 补码 移码

    没有未来的未来不是我想要的未来 o(╥﹏╥)o (つД`)(ノへ ̄.)哭了 学习的是定点数的表示,那我们首先来认识一下什么叫定点数与定点数相对应的另一个概念叫做浮点数所谓定点数就是指小数点的位置固定不 ...

  5. 补码原码转换c语言代码,c/c++原码反码补码原理 以及进制转换

    1首先了解 低字节位 和高字节位 看图 2字节在内存的排列方式//int num = 010; //0开头代表 8禁止 //("%d",num); //所以打印的是8 int nu ...

  6. 二进制运算以及源码、补码、反码概念讲解

    前言 在学习框架源码底层时,有非常多的二进制运算,由于大学学习计算机基础时开小差,没有学习牢固,所以在看底层源码的算法逻辑时遇到二进制运算比较吃力,遂通过一篇博文来总结下二进制运算,记录一下. 读者认 ...

  7. c语言原码 补码 反码,C语言 原码--反码--补码

    //原码,反码,补码 #include #include //数值的表示方法--原码.反码和补码 //原码:最高位为符号位,其余各位为数值本身的绝对值 //反码: //正数:反码与原码相同 //负数: ...

  8. 关于计算机中 原码, 反码, 补码 详解

    本篇文章讲解了计算机的原码, 反码和补码. 并且进行了深入探求了为何要使用反码和补码, 以及更进一步的论证了为何可以用反码, 补码的加法计算原码的减法. 论证部分如有不对的地方请各位牛人帮忙指正! 希 ...

  9. 原码, 反码, 补码, 移码 详解

    本篇文章讲解了计算机的原码, 反码和补码. 并且进行了深入探求了为何要使用反码和补码, 以及更进一步的论证了为何可以用反码, 补码的加法计算原码的减法. 论证部分如有不对的地方请各位牛人帮忙指正! 希 ...

最新文章

  1. tlb存的什么_什么是MMU,TLB
  2. C++——Lambda函数
  3. 大学士带你领略“大院大所”黑科技!
  4. fopen参数mode详解
  5. Android应用程序进程启动过程
  6. 查看SSID的mac地址
  7. 牛客练习赛69 解方程
  8. Linux问题分析或解决_samba无法连接
  9. 数据库访问的性能问题与瓶颈问题【z】
  10. mysql分片库分页查询_Mysql分库分表
  11. 第5 章 引用类型2
  12. spring cloud学习笔记01
  13. OMRON软件安装与配置
  14. require.js加载highcharts.js/exporting.js实现图表的绘制和图片文件功能的导出
  15. 8个免费高清图片素材网站,再也不用担心侵权了。
  16. 事务日志备份文件达到 47G 大小,啥原因导致 ?
  17. MyBatis14 缓存
  18. 判断某整数是正整数、负整数还是零
  19. 全国计算机二级ACCESS在线,全国计算机二级《Access》操作试题及答案
  20. 后OA时代:流程再造

热门文章

  1. 怎么防止U盘中病毒?中毒后怎么处理?
  2. 计算机网络(自顶向下学习笔记)---应用层协议之SMTP
  3. 把客户当成自己的朋友 (销售中的心理学)
  4. 有关Batch Size的玄学被打破了!
  5. matlab平面电磁波入射_平面电磁波传播模拟-MATLAB程序
  6. 【毕设】车牌识别系统的设计与实现
  7. 假设指令:MOV BX
  8. GEE:快速下载NO2、O3、SO2、 HCHO、CH4、CO和气溶胶数据(Sentinel-5P数据集)
  9. javancss中的NCSS和CCN
  10. xshell执行sql脚本