1.给了我们大端法 小端法的概念 每个电脑都是大端法或者小端法 大端法的字节是先高位有效字节先输出 例如 0x00003039表明的是 int值12345 在大端法输出的就是 00 00 00 30 39 在小端法就是 39 30 00 00
2.逻辑右移 算数右移
逻辑右移向右移动左端填充0 向左移动 右端填充0
算术右移向右移动左端填充符号位 向左移动 右端填充0
3.介绍了三种码 原码 反码 补码 机器码大多为补码
正数原码 = 反码 = 补码
负数原码 = 符号位取反 = 符号位取反 + 1
4.各种符号运算的溢出以及运算
5.浮点数表示
V=(-1)^s * M * 2^E
浮点数表示有 符号位s 阶码E 以及 尾数M(小数)
float一共有4个字节 32位 1个符号位 8个阶码 23个尾数(二进制表示)
double一共有8个字节 64位 1个符号位 11个阶码 52个尾数(二进制表示)
浮点数分为
-
规格化的
阶码不为0以及全1 的为规格化的数
2个注意事项- 规格化的数得到的阶码 e 最后算得时候 需要 -Bias Bias = 2^(阶码数-1)-1由此得到阶码范围为 单精度-126~127 和双精度-1022~1023
- 尾数定义为M=1+f 称谓隐式1 这样子我们能得到额外的一个精度 因为我们得表示是V=(-1)^s * M * 2^E 需要把第一个有效二进制得数(第一个1)作为第一位 例如 00001000101010111111111111111111 可以写成1.000101010111111111111111111 * 2^5
-
非规格的
阶码全为0得数
2个注意事项- 此时得阶码值E=1-Bias (可以平滑的从非规格转化为规格数)
- 尾数不包含隐式1
当阶码和小数都是0的时候 此时如果符号位为1的话我们得到-0.0 符号位为0我们得到0.0 然后还有一个用处就是逐渐接近 0 称作逐渐溢出
-
无穷大
阶码全为1以及小数全为0 -
NaN
阶码全为1小数不为0
表示计算 sqrt(-1)或者无穷-无穷
看最大非规格数和最小规格数一个是7/512 一个是8/512 平滑的过度了 这就是非规格数 阶码为1 - bias的魅力
6.浮点数的舍入
7.浮点数的运算
show_bytes的代码
#include<iostream>
using namespace std;
typedef unsigned char *byte_pointer;
void show_bytes(byte_pointer start,size_t len){
size_t i;
for(i = 0; i < len; i++){
printf(" %.2x",start[i]);
}
printf("\n");
}
void show_int(int x){
show_bytes((byte_pointer) &x,sizeof (int));
}
void show_float(int x){
show_bytes((byte_pointer) &x,sizeof (float));
}
void show_pointer(void *x){
show_bytes((byte_pointer) &x,sizeof (void *));
}
void test_show_bytes(int x){
int xx = x;
float fx = (float)xx;
int *px = &xx;
show_int(x);
show_float(fx);
show_pointer(px);
}
int main(){
int x;
cin >> x;
test_show_bytes(x);
return 0;
}