深入理解计算机系统第二章小结 show_bytes的代码

本文深入探讨了计算机底层知识,包括大端法和小端法的概念及其在数值表示中的应用,逻辑右移与算术右移的区别,原码、反码、补码的表示方式,以及浮点数的表示形式如V=(-1)^s*M*2^E。详细阐述了浮点数的规格化和非规格化状态,以及浮点数运算中可能遇到的特殊情况如无穷大和NaN。此外,还介绍了浮点数舍入规则和运算过程。通过代码示例展示了如何显示字节序列,包括整型、浮点型和指针的表示。
摘要由CSDN通过智能技术生成

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个注意事项

    1. 规格化的数得到的阶码 e 最后算得时候 需要 -Bias Bias = 2^(阶码数-1)-1由此得到阶码范围为 单精度-126~127 和双精度-1022~1023
    2. 尾数定义为M=1+f 称谓隐式1 这样子我们能得到额外的一个精度 因为我们得表示是V=(-1)^s * M * 2^E 需要把第一个有效二进制得数(第一个1)作为第一位 例如 00001000101010111111111111111111 可以写成1.000101010111111111111111111 * 2^5
  • 非规格的
    阶码全为0得数
    2个注意事项

    1. 此时得阶码值E=1-Bias (可以平滑的从非规格转化为规格数)
    2. 尾数不包含隐式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;
}
代码存在的逻辑性问题有: 1. 在函数 clip_1_1 和 clip_4_3 中,进行宽高的重新赋值操作,但是并没有对 n_bytes 进行调整,导致输出的图片信息不准确。 2. 在函数 clip_4_3 中,对于宽高比例不符合 4:3 的情况,使用了嵌套的 if-else 结构,使得代码的逻辑复杂,容易出错。同时,在进行浮点数运算时,使用了整数除法,导致计算结果不准确。 3. 在 main 函数中,多次使用了相同的变量名,容易引起混淆。 针对这些问题,可以进行如下的改进: 1. 在进行宽高赋值操作时,同时对 n_bytes 进行调整。 2. 在函数 clip_4_3 中,可以使用简单的 if-else 结构,避免嵌套和复杂的计算。同时,可以将浮点数计算转换为整数计算,避免精度问题。 3. 修改 main 函数中的变量名,使其更具有描述性。 改进后的代码如下: ```c++ #include<bits/stdc++.h> using namespace std; class Photo { private: int width; int height; int n_bytes; public: static int num; Photo():width(0),height(0),n_bytes(0){ num++; }; Photo(int w, int h, int n):width(w),height(h),n_bytes(n){ num++; }; Photo(const Photo& p){ this->width = p.width; this->height = p.height; this->n_bytes = p.n_bytes; num++; }; void show_info(){ cout << num << " " << width << " " << height << " " << n_bytes << endl; };//显示图片信息,输出格式见样例 void clip_1_1(){ if(width > height){ height = width; width = height * 1.0 / 1.0 + 0.5; n_bytes = n_bytes * width * height / (width + height) / (width + height); }else{ width = height; height = width * 1.0 / 1.0 + 0.5; n_bytes = n_bytes * width * height / (width + height) / (width + height); } };//将图片按最大的正方形裁剪,计算新的高和宽。结果截断小数部分,下同 void clip_4_3(){ if(width * 3 > height * 4){ height = width * 4 / 3; n_bytes = n_bytes * width * height / (width + height) / (width + height); }else{ width = height * 4 / 3; n_bytes = n_bytes * width * height / (width + height) / (width + height); } };//将图片按最大的4:3形状裁剪,计算新的高和宽 }; int Photo::num = 0; int main(){ Photo photo1(4000, 3000, 4); photo1.clip_1_1(); photo1.show_info(); Photo photo2(4000, 3000, 4); photo2.clip_4_3(); photo2.show_info(); Photo photo3(photo2); photo3.clip_1_1(); photo3.show_info(); int input_height, input_width, input_n_bytes; cin >> input_height >> input_width >> input_n_bytes; Photo photo4(input_height, input_width, input_n_bytes); photo4.clip_4_3(); photo4.show_info(); photo4.clip_1_1(); photo4.show_info(); return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值