【汇编】01_数值运算

1、整数

预备知识

1K  = 210      = 1024 (Kilo)

1M = 1024K = 220(Mega)

1G = 1024M = 230(Giga)

1T = 1024G = 240(Tera)

1P = 1024T = 250(Peta)

 

1个二进制位:bit        (比特)

8个二进制位:Byte    (字节)       1Byte = 8Bit

2个字节:     Word    (字)         1Word = 2Byte = 16bit

 

1.1 数制

           数    制           基 数数    码

二进制     Binary

八进制     Octal

十进制     Decimal

十六进制  Hexadecimal

 

2

8

10

16

 

0,1

0,1,2,3,4,5,6,7

0,1,2,3,4,5,6,7,8,9

0,1,2,3,4,5,6,7,8,9

A,B,C,D,E,F

 

 

 

 

 

 

 

 

1.2 数制之间的转换

二进制  十六进制                      相通

十进制  二进制                         十 到 二    降幂法(除法)

十进制  十六进制                     十 到 二     降幂法(除法)

 

十六进制:十六进一,借一当十六

 

1.3 逻辑运算(按位操作)

 

 例: X = 00FFH    Y = 5555H    Z = X ^ Y = ?

            X = 0000 0000 1111 1111 B

         ^ Y = 0101 0101 0101 0101 B


            Z = 0101 0101 1010 1010 B

所以 Z= 55AAH

 

附:位运算之左移和右移

左移只有一种——高位丢弃,低位补0

右移有两种:1、逻辑右移——低位丢弃,高位补0

                 2、算术右移——低位丢弃,高位补充与最高位相同的值

 

1.4 数的机器表示(初步)

1.4.1 机器字长(machine word)
  • 定义:一般指计算机进行一次整数运算所能处理的二进制数据的位数
    • 通常也包括数据地址长度
  • 32位字长
    • 地址的表示空间是4GB
    • 对很多内存需求量大的应用而言,非常有限
  • 64位字长
    • 地址的表示空间约为1.8 * 1019 bytes
    • 目前的x86-64机型实际支持48位宽的地址:256TB
  • 机器字在内存中的组织
    • 机器字中第一个字节的地址
    • 相邻机器字的地址相差4(32bit)或者8(64bit)
            

 

1.4.2 字节序(Byte Ordering)

一个机器字内的各个字节如何排列?

  • Big Endian: Sun,PowerPC,Internet
    • 低位字节(Least significant byte,LSB)占据高位
  • Little Endian:x86
    • 低对低,高对高(与LSB相反)

 

1.5 整数表示

 

 

 1.5.1 计算机中整数的二进制编码方式(w表示字长)

负数的二进制表示:补码+1

 

1.5.2 符号位(sign bit)
  • 对于补码表示,MSB(Most Significant Bit)表示整数的符号
    • 0 for nonnegative
    • 1 for negative
1.5.2.1 取值范围

      unsigned                 tag

 

1.5.2.2 无符号数与带符号数之间的转换

 

 

1.5.2.3 C语言中的无符号数与带符号数
  • 常数(Constants)
    • 默认是带符号数
      • 如果有“U”作为后缀则表示无符号数,如 0U,4297665U
  • 如果无符号数与带符号数混合使用,则带符号数默认转换为无符号数
    • 包括比较操作符

实例(w = 32)

即:

 

1.5.2.4 何时采用无符号数
  • 模运算
  • 按位运算

建议:不能仅仅因为取值范围是非负数而使用

 

1.5.2.5 无符号数加法

 

1.5.2.6 补码加法

 

补码加法的溢出

 

1.5.2.7 无符号整数除以2的k次幂

 

 

1.5.2.8 带符号整数除以2的k次幂

 

 

2 浮点数

2.1 IEEE的浮点数标准

 

2.1.1 示例

局限性:只能精确地表示X/2k这类形式的数据(k为整数)

以上三个值二进制表示将会出现无限循环,如1/10的二进制表示小数部分出现0011的无限循环。

 

2.1.2 计算机中的浮点数二进制表示

 

2.1.2.1 C语言的单、双精度

 

2.1.3 浮点数的类型

 

2.1.3.1 规格化浮点数(Normalized)

示例:

 

2.1.3.2 非规格化浮点数(denormalized)

 

2.1.3.3 一些特殊值

 

 

2.1.3.4 一种“小”浮点数实例

数轴上的分布:

 2.1.3.5 一些特例

 

 2.1.3.6 浮点数的一些编码特性

 

2.2 Rounding(舍入)

2.2.1 给定一个实数,如何给出其浮点数表示?

向偶数舍入(Round-to-Even)

这是计算机内默认的舍入方式,也称为“向最近值的舍入”;其他方式会产生系统误差。

关键的设计决策是确定两个可能结果的中间数值的舍入:

  •   确保舍入后的最低有效数字是偶数
  •   比如向百分位的舍入(十进制):
    • 1.2349999        1.23        (Less than half way)
    • 1.2350001        1.24        (Greater than half way)
    • 1.2350000        1.24        (half way -- round up)
    • 1.2450000        1.24        (half way -- round down)

对于二进制数而言:

  • “Even”意味着最低有效数需为0
  • 而最低有效数字右侧的位串为100...

 

1、规格化

2、舍入

3、调整(Postnormalize)

舍入可能导致溢出

 

2.3 C语言中的浮点数

 包括单精度浮点数(single point floating)和双精度浮点数(double point floating)。

 C语言中int(32bit)、float(32bit)和double(64bit)三种数据类型之间的转换规则:

  • int转换成float,不会出现溢出现象,但可能会出现舍入(round-to-even)
  • int或float转换成double,会保留int或float的所有精度
  • double转换成float,可能出现溢出(+∞ or −∞
  • float或double转换成int,会出现舍入至0(个位)

示例:

定义:int x; float f=...; double d=... (d和f都不是NaN)

 

本章参考书籍:《Computer Systems-A Programmer's Perspective(2nd Edition)》

 

转载于:https://www.cnblogs.com/ant-colonies/p/11026616.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值