【汇编】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)》