整数的无符号编码和有符号编码

单个的位没有实际意义,加上解释才有实际意义.我们可以把位组合在一起,并且加上解释以此赋予它意义.

无符号编码表示的数 x >= 0

有符号编码表示的数   min  <= x  and x <= max

当我们对数字的运算超出编码所能表示的范围就叫做溢出.

大多数计算机使用8位的块(字节)作为最小的可寻址单位.机器级程序将内存视为非常大的数组,称为虚拟内存.内存中的每一个字节都由唯一的数字来标识.称为它的地址.

所有地址的集合即为虚拟地址空间.所以,对于32位的机器,虚拟地址空间地址范围为0~0x8FFFFFFF-1,从0开始,需要减去1.

1.二进制转16进制

数学原理: 2^0+2^1+2^2+2^3 = 15

在16进制中我们使用A~F来表示10,11,12,13,14,15,0~9 不变.

由此,对一个二进制序列,我们只要从低位开始,每四个位取一个16进制数.如下.

1111 0001  1000 的16进制表示法为 0xF18

如果最后一次取数的二进制序列少于4位,高位补0,如下

11 0001  1000 的16进制表示法为 0x318

特别当x = 2^n次方时,转16进制方法如下.

因为有16进制的0代表4个二进制位.所以n = i + 4j. i = 0,1,2,3,16进制表示法为0x(2^i)(j个0)

比如 二进制序列 100 0000 是 2^6, 6 = 2+1*4,16进制表示法为0x40

2.16进制转二进制

每一个16进制数,写成4个二进制位

比如.0x7F    0111 1111

对于一个多字节的程序对象,必须建立俩个规则,对象的地址是什么,内存中如何排列这些字节,假设4字节int变量0x7FFFFFFF存储是连续的,

有俩种排列方式.

1.低位在前

0x00   int的第一个字节 FF

0x01   int的第二个字节 FF

0x02   int的第三个字节 FF

0x03   int的第四个字节 7F

2.高位在前

0x00   int的第四个字节 7F

0x01   int的第三个字节 FF

0x02   int的第二个字节 FF

0x03   int的第一个字节 FF

由此我们导出俩种程序对象在内存中排列的方式,大端法,小端法

1.有效的低字节在前,小端法

2.有效的高字节在前.大端法

影响到三个方面.

1.跨主机传送数据,比如从使用大端排列的机器传输字节到小端排列的机器.如下,假设要传送的数据是4个字节的int数字,0x7FFFFFFF(人的书写形式),即2147483647

大端机器的操作如下,将此int的四个字节,存入到一个bye[4]的数组内.[7F,FF,FF,FF,FF,FF,FF],

小端机器接受到数据如下.[7F,FF,FF,FF,FF,FF,FF],那么小端机器认为低字节在前,即传输过来的数字为0xFFFFFFF7F.

2.阅读表示整数数据的字节序列时字节顺序也很重要.如下,考虑到反汇编代码

01 05 43 0b 20 00,这个是我们的书写顺序.

小端机器解释的顺序为 00 20 0b 43 05 01

大端机器解释的顺序为 01 05 43 0b 20 00

3.编写规避正常类型系统的程序时,比如C里面的强制转换和union

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

无符号数编码和有符号整数补码编码

设一个二进制序列[xw-1.........x0]

无符号编码,最高位为负权,即符号位:

X1 = xw-1*2w-1+..........+x0*20

有符号补码编码为:

X2 = -xw-1*2w-1+xw-2*2w-2+......................+x0*20

由以上俩个数学公式,可以导出有符号补码编码整数转无符号编码整数公式

X2-X1 = -xw-1 * 2w-1 -  xw-1*2w-1 = -xw-1*2w

即 X1 = X2 + xw-1*2w    X2 = X1 - xw-1*2w

设,w = 4,考虑如下一个二进制序列[ 1 0 1 1]

它的无符号整数为 8+2+1=11,有符号整数为 -8+3=-5,

有 -5 = 11 - 1*2^4=11-16=-5

有 11 = -5 + 2^4 = -5 + 16 = 11

对俩个整数相加溢出,即超出编码能容纳的范围,

无符号数加法

x +y = x+y 或者 x + y - 2w(即溢出位舍弃),考虑如下代码

#include <iostream>
#include<limits.h>
using namespace std;int main()
{cout << UINT32_MAX + 1 << endl;
}

运行结果为0.原理如下

0xFFFFFFFF + 1 = 0x1 00000000,溢出舍弃,即0x00000000 = 0x1 00000000 - 2^32 = 2^32 - 2^32

有符号数补码加法

x + y = x +y 或者 x+y - 2(正溢出,整数相加变成负数) 或者 x+y + 2(负数相加变成整数)

int main()
{cout << INT32_MAX + 1 << endl; //2147483647 + 1 = 2147483648 - 2^32 = -2147483648
    cout << INT32_MIN - 1 << endl; // -2147483648 - 1 = -2147483649 + 2^32 = 2147483647
}

INT32_MAX 是 0x7FFFFFFF + 1 = 0x80000000 - 0x1 00000000 (2^32) = 0x80000000,第二行同理

posted on 2018-10-07 16:16 好吧,就是菜菜 阅读(...) 评论(...) 编辑 收藏

转载于:https://www.cnblogs.com/shuiyonglewodezzzzz/p/9750381.html

整数的无符号编码和有符号编码相关推荐

  1. 深入理解计算机系统(2.4)------整数的表示(无符号编码和补码编码)

    上一篇博客我们主要介绍了布尔代数和C语言当中的几个运算符.那么这一篇博客我们主要介绍在计算机中整数是如何表示的,诸如我们在编码过程中遇到的对数据类型进行强制转换可能会得到意想不到的结果在这篇博客里你会 ...

  2. 可以获取python整数类型帮助的是什么-Python 的数值类型(整数、长整数、浮点数和复数)...

    在Python中有4种类型的数--整数.长整数.浮点数和复数. 2是一个整数的例子. 长整数不过是大一些的整数. 3.23和52.3E-4是浮点数的例子.E标记表示10的幂.在这里,52.3E-4表示 ...

  3. python整数类型-Python 的数值类型(整数、长整数、浮点数和复数)

    在Python中有4种类型的数--整数.长整数.浮点数和复数. 2是一个整数的例子. 长整数不过是大一些的整数. 3.23和52.3E-4是浮点数的例子.E标记表示10的幂.在这里,52.3E-4表示 ...

  4. randperm--生成随机整数排列

    [功能简介]生成一定范围内整数的随机排列. [语法格式] p=randperm(n) 生成1~n之间整数的无重复随机排列. [实例3.9]生成1~10之间整数的随机排列. >> randp ...

  5. matlab 生成不重复的随机整数 打乱数据排列 生成深度学习数据集

    Matlab自带函数randperm(n)可以产生1到n的整数的无重复的随机排列,利用它就可以得到无重复的随机数.例如: randperm(n):产生一个1到n的随机顺序. >> rand ...

  6. 在python语言中下列是二进制整数_Python从菜鸟到高手(5):数字

    Python从菜鸟到高手(5):数字 发布时间:2020-07-12 02:17:50 来源:51CTO 阅读:1005 作者:androidguy 1 基础知识 Python语言与其他编程语言一样, ...

  7. 2.2.3 C语言中的整数类型及类型转换(为什么强制类型转换值发生改变?带你从机器码的角度分析)

    文章目录: 首先看一下c语言整数数据类型范围 1.有符号数和无符号数的转换(相同字长) 2.不同字长整数之间的转换 (1)大字长变量向小字长变量强制类型转换 (2)小字长变量向大字长变量强制类型转换 ...

  8. 无符号格式化输出的区别%d,%u?

    上来就是重点 unsigned int uint; int i = -1; uint = i; printf("%x %u %d\n", uint, uint, uint); pr ...

  9. 计算机无符号是啥,计算机编程中的无符号是什么

    在计算机编程中,术语"unsigned"(无符号)表示只能保存正数的变量.计算机代码中的"signed"(有符号)表示变量可以包含负值和正值.该属性可应用于大多 ...

最新文章

  1. Alibaba代码规范插件、FindBugs插件安装及详解,IDEA插件安装,代码规范,代码查错,代码格式规范
  2. C# ---扩展方法
  3. 弗吉尼亚理工大学(Virginia Tech)NCR校区招收计算机硕士学位研究生
  4. 【转】Android SDK Manager 更新方法
  5. HTML placeholder
  6. C语言目录文件操作补充
  7. via浏览器下载路径_Via安卓浏览器(软件篇)
  8. PyQt5系列(四)Mac10.12上安装Cocoapods
  9. Python并行实现XML文件转换为XLSX文件
  10. linux日志分析步骤,Linux系统日志分析的基本教程
  11. hp_jetdirect 9100漏洞检测
  12. 键盘之王——求打字峰值速率的小程序(C语言)
  13. UG NX 12 控制基准平面的显示大小
  14. 去除弹窗遮罩层:modal-append-to-body=“false“
  15. android 实现一个开机自启动的service
  16. 系统集成项目管理工程师10大管理47个过程域输入输出工具(项目整体管理)
  17. java meter_自定义Java Swing Meter控件
  18. 计算机视觉——PyCharm连接远程服务器和Linux Screen命令使用
  19. NPC_3level_Inverter:基于MATLAB Simulink的中性点钳位三电平逆变器仿真模型
  20. 十分钟时间搞懂怎么用JS代码渲染实时时间

热门文章

  1. Algorithms_二叉树的前序遍历、中序遍历、后续遍历(深度优先)
  2. Elasticsearch-01CentOS7单节点部署ES5.6.16
  3. Spring Boot2.x-06Spring Boot基础-使用@Conditional注解根据特定的条件装配bean
  4. Spring Boot2.x-03Spring Boot基础
  5. 高精度减法(C++实现)
  6. poi获取段落位置_Apache POI:从java中的word文档(docx)中提取段落和后续表格
  7. linux dns中文域名,Nginx 中文域名配置详解及实现
  8. python映射类型包括哪三种_python新手入门必备——映射类型相关函数
  9. html实现ppt缩放效果,Powerpoint 2016缩放功能详解(附案例)
  10. Unhandled exception 0xC0000005: Access violation writing location