《深入理解计算机系统》学习笔记 - 第三课 - 位,字节和整型

news2024/11/25 10:10:32

Lecture 03 Bits,Bytes, and Integer count 位,字节,整型

文章目录

  • Lecture 03 Bits,Bytes, and Integer count 位,字节,整型
    • 运算:加,减,乘,除
      • 加法
      • 乘法
        • 取值范围
        • 乘法结果
    • 使用无符号注意事项
    • 内存中的表现形式
      • 面向字节的内存组织形式
      • 字长 Words
    • 字节顺序
      • 大端序和小端序
      • 代码检验数据的表现形式
    • 字符串表示
    • 拓展
      • 二进制的一个属性
      • 汇编编码
        • 乘积编码
        • 除法编码
          • 无符号除法编码
          • 有符号除法编码
      • 读字节倒转清单
    • 问题
      • 为什么十进制使用普遍?
      • 为什么用最高位作为符号位?
    • 《深入理解计算机系统》书籍学习笔记

运算:加,减,乘,除

主要运算导致溢出的情况。
都是截去超出w位的高位值。

加法

  • 无符号加法
    操作两个w位相加,结果w+1位。
    u + v = (u + v) mod 2^w

  • 有符号加法
    操作两个w位相加,结果w+1位。
    溢出的部分截去。
    在这里插入图片描述

乘法

取值范围

w 位的数的乘法结果的范围:
最高2w 位。

  • 无符号
    范围:0 <= x * y <= (2^w - 1)^2 = 2^(2w) - 2^(w+1) + 1

  • 二进制补码
    范围:
    最小值: xy >= (-2^(w-1)) * (2^(w-1) -1) = -2^(2s-2) + 2^(w-1)
    最大值(TMin)^2:x
    y <= (-2(w-1))2 = 2^(2w-2)

乘法结果
  • 无符号位
    截去高序w位的值,也就是结果模2^w。
UMult(u,v) = u * v  mod 2^w
  • 有符号位
    截去高序w位的值。

  • 2的幂的乘积与位移的关系
    左移几位就是乘以2的几次幂。

u << k = u * 2^k
  • 无符号除法与位移关系
    右移几位,就是除以2的几次幂
u >> k = u / 2^k

使用无符号注意事项

无符号数绝对不会出现负值的情况。

#include <stdio.h>
#include <unistd.h>

void main() {
    unsigned i;
    int cnt = 5;
    for (i = cnt - 2; i >= 0; i--) {
	usleep(100000);
	printf("%d,%u\n", i,i);
    }
}

// output:
// 3,3
// 2,2
// 1,1
// 0,0
// -1,4294967295
// -2,4294967294
// -3,4294967293
// ....

程序将陷入死循环。
因为无符号永远大于0.

#include <stdio.h>
#include <unistd.h>

void main() {
    #define DELTA sizeof(int)
    int i;
    int cnt = 10;
    for (i = cnt; i-DELTA >= 0; i-= DELTA) {
        usleep(100000);
        printf("%d\n",i);
    }
}

// output:
// 10
// 6
// 2
// -2
// -6
// -10
// ...

解决无符号循环问题:
使用总数作为终止判断条件,而不是0.

void main() {
    unsigned i;
    int cnt = 5;
    for (i = cnt-2; i < cnt; i--) {
        printf("%d\n",i);
    }
}

内存中的表现形式

面向字节的内存组织形式

  • 程序通过地址指向数据
    从概念上讲,可以把它想象成一个非常大的字节数组。当然实际并非如此。
  • 地址就像数组的索引
    指针变量存储地址。

注意:系统给每个进程分配私有的地址空间。

字长 Words

面向字节内存组织方式
在这里插入图片描述

32位的四个字节,64位的八个字节。

字节顺序

大端序:最低有效位字节具有最高地址
小端序:最低有效位字节具有最低地址

4字节的值:0x01234567
A

大端序和小端序

现在几乎都是小端序。

大端序:人类更容易识别。
但是对于机器来说,无所谓,只要有统一标准就行。

代码检验数据的表现形式

指向unsigned char *的指针允许作为字节数组处理

#include <stdio.h>

typedef unsigned char *pointer;

void show_bytes(pointer start, size_t len) {
    size_t i;
    for (i = 0; i < len; i++)
        printf("%p\t0x%.2x\n", start+i, start[i]);
    printf("\n");
}

void main() {
    int a= 15213;
    printf("int a = 15213;\n");
    show_bytes((pointer) &a, sizeof(int));
}

// output:
// int a = 15213;
// 0x7ffc2881f59c  0x6d
// 0x7ffc2881f59d  0x3b
// 0x7ffc2881f59e  0x00
// 0x7ffc2881f59f  0x00

字符串表示

  • 用字符数组表示。
  • 每个字符使用ASCII格式编码
    • 字符集的标准7位编码
    • 字符0 使用 0x30 编码
      数字i 使用 ox30 + i 表示
  • 字符应该有空终止符
    使用字符0

char S[6] = "18213" 编码:
在这里插入图片描述

拓展

二进制的一个属性

1 + 1 + 2 + 4 + 8 + … + 2^(w-1) = 2^w
得出:
在这里插入图片描述

汇编编码

乘积编码
  • 乘积代码
    文件mul12.c:
long mul12(long x)
{
    return x*12;
}
  • 汇编代码
    生成汇编代码: gcc -O2 -S mul12.c
    汇编文件mul12.s:
leaq (%rax, %rax, 2), %rax   // t <- x + x*2
sqlq $2, %rax                // return t << 2;
除法编码
无符号除法编码
  • 除法代码
unsigned long udiv8(unsigned long x) {
    return x/8;
}
  • 汇编代码
    生成汇编代码: gcc -O2 -S udiv8.c
    汇编文件udiv8.s:
shrq $3, $rax    // return x >> 3;
有符号除法编码

与无符号类似,不过结果需要加1。

  • 除法代码
long udiv8(unsigned long x) {
    return x/8;
}
  • 汇编代码
    生成汇编代码: gcc -O2 -S udiv8.c
    汇编文件udiv8.s:
    testq %rax, %rax // if x < 0
    js L4
L3:
    shrq $3, $rax    // x >> 3;
    ret              // ret
L4:
    addq %7, %rax    // x += 7
    jmp L3

读字节倒转清单

按小端序读取:
在这里插入图片描述

问题

为什么十进制使用普遍?

因为人们有十个手指头。

为什么用最高位作为符号位?

我们看下二进制转化为有符号数公式:
在这里插入图片描述

满足了符号数以下特征:
整数负数各一半。

再问为什么不直接用符号位来表示正负数?
下面这种表示方式:

1001
= -1*(2^0) = -1

不利于无符号有符号的转换。

当然,主要这种情况可以满足所有情况了,我们没有必要再考虑去推翻它,这个没有必然的合理优势的话是不可能推翻的。

《深入理解计算机系统》书籍学习笔记

《深入理解计算机系统》学习笔记 - 第一课 - 课程简介
《深入理解计算机系统》学习笔记 - 第二课 - 位,字节和整型
《深入理解计算机系统》学习笔记 - 第三课 - 位,字节和整型

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1265304.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

微信小程序Vue+nodejs教室自习室座位预约系统68u2m

本文从管理员、用户的功能要求出发&#xff0c;教室预约系统小程序中的功能模块主要是实现管理端&#xff1b;首页、个人中心、教室信息管理、教室设备管理、用户管理、教室预约管理、管理员管理、系统管理&#xff0c;微信端&#xff1b;首页、教室信息、教室设备、教室预约、…

osgFX扩展库-异性光照、贴图、卡通特效(1)

本章将简单介绍 osgFX扩展库及osgSim 扩展库。osgFX库用得比较多,osgSim库不常用&#xff0c;因此&#xff0c;这里只对这个库作简单的说明。 osgFX扩展库 osgFX是一个OpenSceneGraph 的附加库&#xff0c;是一个用于实现一致、完备、可重用的特殊效果的构架工具&#xff0c;其…

C#:程序发布的大小控制

.net不讨喜有个大原因就是.net平台本身太大了&#xff0c;不同版本没有兼容性&#xff0c;程序依赖哪个版本用户就要安装哪个版本&#xff0c;除非你恰好用的是操作系统默认安装的版本——问题是不同版本操作系统默认安装的不一样。 所以打包程序就很头疼&#xff0c;不打包平台…

Python Selenium 图片资源自动搜索保存 项目实践

实现访问首页 from os.path import dirnamefrom selenium import webdriverclass ImageAutoSearchAndSave:"""图片自动搜索保存"""def __init__(self):"""初始化"""self.driver webdriver.Chrome(executable_pa…

Vue实现可拖拽边界布局

Vue实现可拖拽边界布局 在前端开发中&#xff0c;有时需要实现一种可拖拽边界的布局&#xff0c;通过拖动分隔线来调整不同区域大小。例如&#xff0c;下图是一个典型的可拖拽边界布局&#xff0c;它由左右两个区域组成&#xff0c;左边是一个树形菜单&#xff0c;右边是一个上…

C++单调向量(栈):好子数组的最大分数

作者推荐 利用广度优先或模拟解决米诺骨牌 题目 给你一个整数数组 nums &#xff08;下标从 0 开始&#xff09;和一个整数 k 。 一个子数组 (i, j) 的 分数 定义为 min(nums[i], nums[i1], …, nums[j]) * (j - i 1) 。一个 好 子数组的两个端点下标需要满足 i < k <…

Vue3+java开发组队功能

Vue3java开发系统组队功能 需求分析 创建用户可以创建一个队伍&#xff08;一个房间队长&#xff09;&#xff0c;设置队伍人数&#xff0c;队伍名称&#xff08;标题&#xff09;&#xff0c;描述&#xff0c;超时时间。搜索加入&#xff0c;用户可以加入未满的队伍&#xf…

分子骨架跃迁工具-DiffHopp 评测

一、文章背景介绍 DiffHopp模型发表在ICML 2023 Workshop on Computational Biology&#xff08;简称&#xff1a;2023 ICML-WCB&#xff09;上的文章。第一作者是剑桥计算机系的Jos Torge。 DiffHopp是一个专门针对骨架跃迁任务而训练的E3等变条件扩散模型。此外&#xff0c;…

三、详解桶排序以及排序内容大总结

详解桶排序以及排序内容大总结 文章目录 详解桶排序以及排序内容大总结堆堆的操作(大)heapinsert --- 调整成大根堆heapify --- 移除原根节点后&#xff0c;继续调整成大根堆堆中某个位置的数值发生改变 堆排序优化 堆练习比较器桶排序基数排序 堆 注&#xff1a;堆是一种特殊…

mongodb查询数据库集合的基础命令

基础命令 启动mongo服务 mongod -f /usr/local/mongodb/mongod.conf //注意配置文件路径停止mongo服务 关闭mongodb有三种方式&#xff1a; 一种是进入mongo后通过mongo的函数关闭&#xff1b; use admin db.shutdownServer()一种是通过mongod关闭&#xff1b; mongod --s…

算法分析-寻找假币题

一.题目需求 你手里有70枚重量相等的真金硬币&#xff0c;但你知道其中有一枚是假币&#xff0c;比其他金币轻。 你有一个平衡秤&#xff0c;你可以一次在两边放上任意数量的硬币&#xff0c;它会告诉你两边是否重量相同&#xff0c;或者如果不相同&#xff0c;哪边更轻。 问题…

C语言——输入两个正整数 m 和 n。求其最大公约数和最小公倍数。

#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h> int main() {int m, n;int i;int x 1;int y 0;printf("请输入两个正整数m和n&#xff1a;\n");scanf("%d,%d", &m, &n);for (i 1; i < m && i < n; i) {if (m % i 0 …

汉威科技全系列VOC气体检测产品,护航绿色低碳安全发展

可能很多人都不知道&#xff0c;危化品爆炸、城市光化学烟雾污染&#xff08;如英国伦敦烟雾事件&#xff09;、城市灰霾、温室效应、臭氧层空洞等问题背后的元凶都是VOC。VOC(Volatile Organic Compounds)即挥发性有机物&#xff0c;这类物质易挥发&#xff0c;且普遍具有毒性…

【PHP】MySQL简介与MySQLi函数(含PHP与MySQL交互)

文章目录 一、MySQL简介二、MySQLi函数1. 开启mysqli扩展&#xff1a;2. PHP MySQLi扩展的常用函数 三、PHP与MySQL交互0. 准备1. 创建连接&#xff08;mysqli_connect() &#xff09;连接mysql语法 2. 选择数据库&#xff08;mysqli_select_db()&#xff09;3. 在php中操作数据…

算法通关村-----数据流的中位数

数据流的中位数 问题描述 中位数是有序整数列表中的中间值。如果列表的大小是偶数&#xff0c;则没有中间值&#xff0c;中位数是两个中间值的平均值。 例如 arr [2,3,4] 的中位数是 3 。 例如 arr [2,3] 的中位数是 (2 3) / 2 2.5 。 实现 MedianFinder 类: MedianFin…

使用 DMA 在 FPGA 中的 HDL 和嵌入式 C 之间传输数据

使用 DMA 在 FPGA 中的 HDL 和嵌入式 C 之间传输数据 该项目介绍了如何在 PL 中的 HDL 与 FPGA 中的处理器上运行的嵌入式 C 之间传输数据的基本结构。 介绍 鉴于机器学习和人工智能等应用的 FPGA 设计中硬件加速的兴起&#xff0c;现在是剥开几层“云雾”并讨论 HDL 之间来回传…

高校学生宿舍公寓报修维修生活管理系统 微信小程序b2529

本课题要求实现一套基于微信小程序宿舍生活管理系统&#xff0c;系统主要包括&#xff08;管理员&#xff0c;学生、维修员和卫检员&#xff09;四个模块等功能。 使用基于微信小程序宿舍生活管理系统相对传统宿舍生活管理系统信息管理方式具备很多优点&#xff1a;首先可以大幅…

ESP32-Web-Server 实战编程-通过网页控制设备多个 GPIO

ESP32-Web-Server 实战编程-通过网页控制设备多个 GPIO 概述 上节 ESP32-Web-Server 实战编程-通过网页控制设备的 GPIO 讲述了如何通过网页控制一个 GPIO。本节实现在网页上控制多个 GPIO。 示例解析 前端设计 前端代码建立了四个 GPIO&#xff0c;如下死 GPIO 2 在前端的…

【Java Spring】Spring MVC基础

文章目录 1、Spring MVC 简介2、Spring MVC 功能1.1 Spring MVC 连接功能2.2 Spring MVC 获取参数2.2.1 获取变量2.2.2 获取对象2.2.3 RequestParam重命名后端参数2.2.4 RequestBody 接收Json对象2.2.5 PathVariable从URL中获取参数 1、Spring MVC 简介 Spring Web MVC是构建于…

【计算机网络笔记】以太网

系列文章目录 什么是计算机网络&#xff1f; 什么是网络协议&#xff1f; 计算机网络的结构 数据交换之电路交换 数据交换之报文交换和分组交换 分组交换 vs 电路交换 计算机网络性能&#xff08;1&#xff09;——速率、带宽、延迟 计算机网络性能&#xff08;2&#xff09;…