二进制,是学计算机的同学起步时候都会接触的一个进制,相比十进制,二进制只有0和1。

20世纪被称作第三次科技革命的重要标志之一的计算机的发明与应用,因为数字计算机只能识别和处理由‘0’.‘1’符号串组成的代码。其运算模式正是二进制。19世纪爱尔兰逻辑学家乔治布尔对逻辑命题的思考过程转化为对符号"0''.''1''的某种代数演算,二进制是逢2进位的进位制。0、1是基本算符。因为它只使用0、1两个数字符号,非常简单方便,易于用电子方式实现。 --《百度百科》

那么在我们程序中,很多时候需要理解,整数对应的二进制换算。比如正常的整数520,我们很显然知道,这数字的值是多少。但是事实上他表示的是5X(10^2)+2X(10^1)+0X(10^0),他表示的每个位置数字含义之和,每个位置从右向左,第一位乘以10的0次方,第二位乘以10的1次方,以此类推。

正整数的二进制表示

正整数的二进制表示和十进制类似,二进制每一位只有0或1,同时每一位乘以2的N次方。比如二进制100,代表就是1x(2^2)+0x(2^1)+0x(2^0)。对应是十进制就是4。

负整数的二进制表示

在十进制中负数就是在前面加一个负号表示负数(-),如-100,-1。在二进制中,没有负号的概念,但是也有类似的东西。二进制使用最高位表示符号位,用1表示负数,用0表示正数。但问题来了,哪个是最高位呢?整数有4种类型,byte,short,int,long。分别占用1,2,4,8个字节,即对应的8,16,32,64位。每种类型的符号位都是其最左边的一位。

举个例子,以byte为例,占8位。byte a=-1,如果只是简单得把最高位变成1,那么二进制就是10000001,但是这个是错误的,实际应该是11111111。byte a=-127,如果最高位变1,二进制就是11111111,实际上应该是10000001。

这个表示法有点奇怪,这个叫什么呢?在计算机中,有三种表示法,即原码、反码和补码。

原码是计算机机器数中最简单的一种形式,数值位就是真值的绝对值,符号位位“0”时表示正数,符号位为“1”时表示负数,原码又称带符号的绝对值。为了方便整数和小数区别,整数的符号位与数值位之间用“,”隔开,小数的符号位与数值位之间用“.”隔开。
反码通常是用来由原码求补码或者由补码求原码的过渡码。整数的反码定义如图3整数反码定义,小数的定义如图4小数反码定义。根据定义,可以得到机器数的反码的整数和小数中“0”的表示形式各有2种,“+0”和“-0”不一样,以8位机器数为例,整数的“+0”原码为0,0000000;整数的“-0”原码为1,1111111;小数的“+0”原码为0.0000000,小数的“-0”原码为1.1111111。反码跟原码是正数时,一样;负数时,反码就是原码符号位除外,其他位按位取反。

补码就是在原码表示法上取反然后加1,比如-1 ,1的原码是00000001,取反就是11111110,然后加1就是11111111。-127,127的原码是01111111,取反就是10000000,加1就是10000001。

给定一个负数的二进制表示,想知道它的十进制,可以用相同的补码运算。比如10010010,先取反,变为01101101,然后加1,结果就是01101110,它的十进制就是110,原值就是-110。

直觉上,应该先减1,然后取反,但是计算机只能做加法,而补码的一个良好特征就是,对负数的补码表示做补码运算,可以得到其对应正数的原码。

那么为什么负数要用补码这么奇怪的表述方式呢?是因为只有这样,计算机才能正确得做加减法运算。

前面说过,计算机只能做加法运算。如果用原码表示,1-1其实就是1+(-1)。

那么这显然是错误的,1-1却等于-2。如果换成补码表示:

这个结果是正确的,再举个例子,6-1=5。

理解了二进制的加减法,就可以理解有时候正数的运算会出现负数结果。当计算机超出表示范围时候,往往最高位是1,就会被当做负数。比如byte 127+1:

因为byte的范围是-128~127,负数比正数多表示一位。

vs不识别0b二进制格式_数据背后的二进制相关推荐

  1. mysql 二进制格式_解析MYSQL BINLOG 二进制格式(3)--QUERY_EVENT

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 FORMAT_DESCRIPTION_EVENT class:Query_log_event event:QUERY_EVENT event_code:0 ...

  2. python读二进制格点雷达基数据_对numpy中二进制格式的数据存储与读取方法详解...

    使用save可以实现对numpy数据的磁盘存储,存储的方式是二进制.查看使用说明,说明专门提到了是未经压缩的二进制形式.存储后的数据可以进行加载或者读取,通过使用load方法. In [81]:np. ...

  3. mysql二进制格式_二进制格式安装 MySQL

    二进制格式安装 MySQL 什么是通用二进制格式? 已经编译进行过编译的软件包, 下载到本机直接解压到特定的目录下就可以使用的格式. 1. 查询本地是否安装 mysql 数据库相关的软件包 (卸载之) ...

  4. 识别图片并可视化_数据可视化3大发展方向

    数据可视化这一概念不过几年前才产生,但讲故事的技巧却早就已经生根发芽了.运用人物.事件.事件顺序.地点.时间段.感情和数字等要素,讲述故事总是让人类着迷. 如今,数据可视化可以图像化地叙述事件,及其起 ...

  5. mysql导出二进制日志_使用mysqlbinlog提取二进制日志

    MySQL binlog日志记录了MySQL数据库从启用日志以来所有对当前数据库的变更.binlog日志属于二进制文件,我们可以从binlog提取出来生成可阅读的SQL语句来重建当前数据库以及根据需要 ...

  6. 二进制搜索树_数据结构101:二进制搜索树

    二进制搜索树 by Kevin Turney 凯文·特尼(Kevin Turney) 数据结构101:二叉搜索树 (Data Structures 101: Binary Search Trees) ...

  7. python 变量转二进制流_将图像转换为二进制流

    我的应用程序有两个方面,一方面,我使用C++来从PrORA的EBOSK SDK读取相机的帧.当第一次接收到该流时,在将缓冲器转换为图像之前,我能够一次读取流16位,以便对每个像素执行一些计算,即,对于 ...

  8. python中怎么查看二进制转换的数据_python处理二进制数据的方法

    #!/usr/env/env python #-*- coding: cp936 -*- ''''' add Head Infomation for pcm file ''' import sys i ...

  9. livechart 只显示 y 值_基于Python语言的SEGY格式地震数据读取与显示编程

    敬请关注<地学新视野> 摘要:本文简单介绍了SEG-Y地震数据文件格式,以及如何用Python语言编写读写SEG-Y格式的地震数据并绘制地震剖面,其中用到了Segyio和matplotli ...

最新文章

  1. sqlite3.h--dbhelp.h数据库底层文件
  2. Min_25筛学习笔记
  3. [Windows][C#][.NET][WPF]基于ArcFace2.0+红外双目摄像头的活体检测
  4. 数字图像处理matlab实验对图像复原,数字图像处理实验07图像的复原处理
  5. 从12306信息泄露了解何为黑客撞库拖库洗库
  6. @async 默认线程池_SpringBoot 线程池的使用
  7. 生活质量衡量系统_16个你需要了解的DevOps指标,助你提升软件质量
  8. Windows_Server_2016 远程桌面120天授权过期
  9. 出差沈阳记之初来乍到
  10. android 电视怎么投屏,安卓手机怎么投屏到电视
  11. 【2018 Nature】Review Disease Primers - Epilepsy 【文献翻译】
  12. 用Java写PTA 7-11 设计一个能处理异常的Loan类
  13. matlab中cell是什么意思,matlab中cell的用法
  14. 一文读懂 Traefik v 2.6 企业版新特性
  15. 公司产品介绍PPT参考
  16. Python中的decorator装饰器使用方法
  17. JSP和ASP.NET到底谁才是未来的主宰
  18. 优达学城机器学习之--聚类(Cluster)
  19. arm基本了解(笔记)
  20. 21考研王道数据结构PPT资料分享

热门文章

  1. Go并发编程里的数据竞争以及解决之道
  2. 关于MySQL优化的几个问题
  3. 微软是如何使用C#重写C#编译器并将其开源的
  4. spring boot入门学习---热部署
  5. 安卓动态调试七种武器之离别钩 – Hooking(下)
  6. 从零开始搭建Ubuntu 环境下的Android 源码开发环境
  7. webrtc 渲染_webRTC 中 timing 信息的使用
  8. Python 读入Excel表时如何判空NaN
  9. 计算机id不同于MAC,Gurman:Mac上的Face ID将在几年内出现
  10. Chrome DevTools的Network面板