代码之外--整型数据那点事
来源:互联网 发布:淘宝达人v任务 编辑:程序博客网 时间:2024/04/29 18:07
说到整型,在我们心目中想起的大概只有int,short( int),long( int),long long和signed、unsigned这几个名词吧,然而,为什么会“溢出”,又为什么正值和负值会不对称呢,对unsigned整型输入负数又会导致什么呢,在C++Primer Plus中,采取了一个圆环来表示这样的结构,恐怕还是比较难以理解,那就来深入看一下二进制码内部的结构把。
数在计算机中是以二进制形式表示的
正负以最前面一个数作为符号位,0为正,1为负,人们开发了三种显示的方法,原码、反码、补码,都是有符号定点数的表示方法。
以一个字节为例,原码(除去符号位)就是这个数本身的二进制形式。
例如
0000001 就是+1
1000001 就是-1
正数的反码和补码都是和原码相同。
负数的反码是将其原码除符号位之外的各位求反(1变0,0变1)
[-3]反=[10000011]反=11111100
负数的补码是将其原码除符号位之外的各位求反之后在末位再加1。
[-3]补=[10000011]补=11111101
那为什么要设立补码机制呢
其一,在原码取补后,拥有a补-b补=a补+(-b)补的性质,这使得我们的计算机只需要装有加法运算器就可以进行加减运算了
其二,这解决了正负0和溢出的问题
对于补码而言,如果+1之后有进位的,要一直往前进位,包括符号位!这么说可能不太直观,我们来看一个例子
[10000000]补
=[10000000]反+1
=11111111+1
=(1)00000000
=00000000(最高位溢出了,符号位变成了0)
然后,规定10000000为-128(在原码中是-0,也是为什么负数比正数多一个的原因),这时候,溢出就变得很好理解了,对127(补码为01111111)再加1,由于进位就变为10000000了,没错,当溢出一次时,就丢了一个2的最高位数次方大小的值,可以理解为计算机给他的内存从右到左写入的时候没位置了,直接扔掉了!
最后的一点,对signed整型输入负值会发生什么?
其实计算机会把原码丢到实现转换完,错以为是真-unsigned,结果,你的unsigned整型就会变得极端大——你的好好的二进制最高位变成了1!
logichack原创,随便写写,随意转载。
- 代码之外--整型数据那点事
- 代码生成那点事
- 代码生成那点事
- 代码块的那点事
- eclipse 代码混淆的那点事
- MySQL那点事之查询数据
- 数据建模那点事儿
- 说说APK反编译(代码插入)的那点事
- 开发那点事系列一 - 代码美,人生美!
- 刚开始学写代码的那点事
- CC2640的RTOS系统代码的那点事
- 设计模式-《设计模式那点事》代码
- 代码之外
- 关于大数据批量处理的那点事
- MySQL那点事之插入、更新与删除数据
- 数据时代的平台架构项目开发那点事
- 小程聊微服务-数据抽取那点事(一)
- 面试那点事
- 197. Rising Temperature#1
- Grub引导项修复详解
- 16A.Flag
- 狼文化的一点思考
- PLSQL中显式Cursor、隐式Cursor、动态Ref Cursor
- 代码之外--整型数据那点事
- ccf试题 数字排序
- 生成验证码
- 操作系统笔记(六)页面置换算法 FIFO法 LRU最近最久未使用法 CLOCK法 二次机会法
- This
- 程序员,别了校园入了江湖
- 守护进程&创建守护进程&fork一次和fork两次的区别
- DOS批处理高级教程(一) 批处理基础
- 树莓派学习笔记二:软件包安装