博客
关于我
计算机里面那些奇奇怪怪的数值问题(原码补码反码移码)
阅读量:232 次
发布时间:2019-03-01

本文共 1104 字,大约阅读时间需要 3 分钟。

计算机数值处理基础

一、一些概念

机器数

数值在计算机内部的编码,即实际存储的0/1序列。

真值

机器数想要表示的实际数值,可理解为现实生活中我们平常所用的有正负号的数。

机器数与真值的对应关系

主要有4种:原码,反码,补码,移码。

二、数值比较

有符号数与无符号数

  • 给定一个数,在计算机里如何存储,表示成0/1序列是编码的事,而对这0/1序列如何解释是上层软件的事情。
  • 通常默认为有符号数相比,若出现无符号数,则按照无符号数相比。
  • 如C语言中可解释为有符号数和无符号数,而Java中只解释为有符号数。

示例

  • 11...111B(-1) < 00...000B(0)
  • 0U为无符号数,11...111(2^32-1) > 00...000(0)
  • 判断常量类型时是先将符号“踢开”,只看后面的数值在哪个区间,根据区间确定类型。

编程示例

  • strlen函数返回的是size_t,按无符号数解释,比较时结果不正确。
  • 改进方法:return strlen(str1) > strlen(str2),直接让两个串的长度比较。

三、浮点数(IEEE 754)

浮点数格式

  • 符号位:1表负,0表正
  • 阶码用移码表示,是一个定点整数,偏置常数是2^n-1
  • 尾数是一个定点小数,实际表示24位有效数字,隐含了一位1

表示范围

  • 32位单精度:最小正数2-126,最大整数(2-2^23)*2^127
  • 64位双精度:最小正数2-1022,最大整数(2-2^52)*2^1023

特殊表示

  • 阶码全0尾数全0:+0或-0
  • 阶码全1尾数全0:+∞或-∞
  • 阶码全1尾数非0:NaN(Not a Number)
  • 阶码全0尾数非0:非规格化数

加减法运算

  • 对阶:只有阶数相等,尾数才能直接相加减
  • 尾数加减:尾数是由定点原码小数表示
  • 规格化:将尾数变成1.B形式,相应调整阶码
  • 结果舍入:保留至少2位,紧跟尾数右边的叫做保护位
  • 阶码溢出判断:结果的阶码全1表上溢,全0表下溢
  • 四、数值运算

    移位运算

    • 逻辑移位:不考虑符号位
    • 算术移位:考虑符号位
    • 编译器和CPU移位运算不同:编译器实际移位,CPU移位数取模

    位扩展与截断

    • 扩展:0扩展与符号扩展
    • 截断:长数向短数转化时发生截断

    加减法

    • 现代计算机整数都可以看做是用补码表示的
    • 乘除法:编译器处理常量与变量乘除时会用移位,加法,减法的组合运算来代替

    浮点数乘除法

    • 加减法的主要区别在于乘除法不用对阶
    • 乘法运算过程:尾数与尾数运算,指数与指数运算

    五、总结

    计算机数值处理涉及编码、比较、运算等多个方面,理解补码、移码、浮点数等概念至关重要。编程时需注意数值类型的影响,避免因类型转换不当导致的错误。

    转载地址:http://hpiv.baihongyu.com/

    你可能感兴趣的文章
    Python 单词字母顺序不变且所有倒排
    查看>>
    python 反射机制
    查看>>
    python 启动提示IDLE's subprocess didn't make conne...
    查看>>
    python 命令接口_实现“[命令][操作][参数]”样式的命令行接口?
    查看>>
    Python 和 OpenCV.如何检测图像中的所有(填充)圆形/圆形对象?
    查看>>
    Python 和 RabbitMQ - 聆听来自多个渠道的消费事件的最佳方式?
    查看>>
    python编辑器打不开_关于命令ride.py打不开RF,而是打开pycharm编辑器问题解决思路...
    查看>>
    python编译exe同时支持32位_第三周:同时管理64位和32位版本的Python,并用Pyinstaller打包成exe...
    查看>>
    Python 和Java 哪个更适合做自动化测试?
    查看>>
    Python编程:掌握高级语言程序设计。从零基础到精通,收藏这篇就够了!
    查看>>
    python 图片转ico
    查看>>
    python 图片转文字、语音转文字、文字转语音保存音频并朗读
    查看>>
    python 在包含类似字符\x16、\x12、\x某某的数组中将以\x开头的字符找出来的方法
    查看>>
    Python 在并行进程之间共享字典
    查看>>
    Python 垃圾收集器文档
    查看>>
    python 基于 wordcloud + jieba + matplotlib 生成词云
    查看>>
    python 基于detectron或mask_rcnn的mask遮罩区域进行图片截取
    查看>>
    Python编程:Tkinter图形界面设计(2)
    查看>>
    Python 基础 - Day 5 Learning Note - 模块 之 标准库:time (1)
    查看>>
    Python 基础一
    查看>>