高校校园网站建设,南城仿做网站,网站设计排名北京,开公司需要几个人注册系列文章目录
信息的表示和处理 :
Information Storage#xff08;信息存储#xff09;Integer Representation#xff08;整数表示#xff09;Integer Arithmetic#xff08;整数运算#xff09;Floating Point#xff08;浮点数#xff09; 文章目录 系列文章目录前…系列文章目录
信息的表示和处理 :
Information Storage信息存储Integer Representation整数表示Integer Arithmetic整数运算Floating Point浮点数 文章目录 系列文章目录前言一、十六进制表示法Hexadecimal Notation二、字数据大小三、寻址和字节顺序Addressing and Byte Odering四、表示字符串Representing String五、表示代码六、布尔代数简介七、C语言中的位级运算Bit-Level Operations in C八、C语言中的逻辑运算Logical Operation In C九、C语言中的移位操作Shift Operation in C9.1逻辑右移9.2算数右移9.3示例解释 总结参考文献 前言
本文参考书籍是《深入理解计算机系统 3th 中文版》本文的图片大多是参考和来自于b站up主九曲阑干。非常感谢大佬侵权删。
内存 对内存做一个抽象 将整个内存看做一个大的数组。数组每个元素就是一个空间空间大小为1字节每个数组都有一个下标也就是地址
字节Byte: 1byte 8bit 一个存储单元可以存储一个字节也就是8个二进制位。所以字节计算机的最小存储单元。 可以这样想一个字节对应一个地址计算机能够访问的如果再小那么计算机就无法通过变量的形式访问。 最小存储空间的变量类型char就占一个字节而int占4个字节 一、十六进制表示法Hexadecimal Notation
十六进制以 0x或者0X 开头。 A10C:12F15 16进制 转换 10进制 转换 2进制 下面尽量记住 小技巧记住ACF通过1 -1来退出另外几个 16进制与2进制之间相互转换很简单详情参考书P25 习题2.116进制与10进制数之间的转换详情参考书P26 习题2.2
小学奥赛的短除法充分理解进制中每一位代表什么比如n进制 ( 12345 ) n 1 × n 4 2 × n 3 3 × n 2 4 × n 1 5 × n 0 (12345)_{n} 1 \times n^{4} 2 \times n^{3} 3 \times n^{2} 4 \times n^{1} 5 \times n^{0} (12345)n1×n42×n33×n24×n15×n0 其实不管什么方法本质都一样而第二种方式直指本质。
二、字数据大小
每个计算机有对应的字长word size虚拟地址用一个字来编码所以字长决定了虚拟地址空间的大小。 这样来理解 每个内存单元式一个字节一个字节存8bit。这个没有异议。然而还有每个字节都有地址啊地址也要存储。存储地址用多少位或者多少字节 存储地址用的位的数量越多因为一一对应的缘故地址的个数就越多计算机访问的地址数量越多能存储的变量所占内存也就越多因为能访问到寻址就能被使用所以内存就越大 word sizeVirtual Address Spacew bit0 ~ 2 w 2^w 2w -132 bit0 ~ 2 32 2^{32} 232 -1 4 G B \textcolor{red}{4GB} 4GB64 bit0 ~ 2 64 2^{64} 264 -1
int32_t 和 int64_t 类型分别为 4 字节和 8 字节不受机器影响。使用确定大小的整数类型很有用之前写程序的时候不太关注类型的大小以后还是要多关注特别是嵌入式。 对 32 位和 64 位机器而言char、short、int、long long 长度都是一样的为 1248。long 的长度不一样。 float 和 double 的长度一样分别为 48。 对于指针地址不同字长的计算机肯定是不同的32位是4字节64位是8字节 三、寻址和字节顺序Addressing and Byte Odering 对于跨越多字节的对象有两个规则要搞清楚 这个对象的地址是什么在内存中如何排列这些字节 先说结论 多字节对象被存储在连续的字节序列中连续的地址中对像的地址为所使用字节中最小的地址 假设有一个数 int类型 0x01234567 这个数一位就占4bit所以两位就占8bit一个字节在内存中应该是这个样子的
小端法数字的低位在前前就是最小地址 大端法数字的高位在前字节逆序不是整个数字逆序啊 不管用哪个方法存储这个数的地址都是0x100。因为在两种字节序中0x01234567 的起始地址都是 0x100但字节的排列顺序不同。这意味着不管是大端法还是小端法整个 int 类型数据的存储都是从 0x100 开始但字节内的顺序会根据字节序的不同而改变。
小练习 输出结果
67452301由这个结论可以知道在我的电脑是小端法 四、表示字符串Representing String
C语言中字符串最后有个终止符{‘\0’}
ASCII 字符适合编码英文文档。UnicodeUTF-8使用 4 字节表示字符一些常用的字符只需要 1 或 2 个字节。所有 ASCII 字符在 UTF-8 中是一样的。JAVA 使用 UTF-8 来编码字符串。 五、表示代码
二进制代码是不兼容的一般无法在不同机器间移植。这个作者深有体会有一次犯蠢把在导师发过来的程序文件中的可执行文件直接拿到linux上跑直接就崩掉了。查了一下gpt才知道原来不同机器之间不要跑可执行文件。换一台机器要重新编译。从机器的角度看程序就是一个字节序列。详情请学习汇编语言 六、布尔代数简介
推荐大家去玩Steam上的一个游戏叫做图灵完备Turing Complete。看能不能通过这个游戏开一门新的坑讲讲布尔运算或者进一步讲数字电路咳咳咳有生之年系列 这里的异或XOR比较难以理解 它在两个布尔输入之间进行操作。异或运算符的结果是当两个输入的值不相同时输出为真1当两个输入的值相同时输出为假0。换句话说它只有在恰好一个输入为真时才返回真。 七、C语言中的位级运算Bit-Level Operations in C
位运算的常见应用是实现掩码。掩码表示从一个字中选出的位的集合。 “实现掩码”applying a mask通常指通过位运算操作来选择或屏蔽mask数据中的特定位bits。 常用的位运算掩码操作
与运算AND用于选取特定的位。或运算OR用于设置特定的位。异或运算XOR用于翻转特定的位。非运算NOT用于翻转所有位但通常与其它操作结合以影响特定的位。
示例使用掩码来读取和修改特定位 假设我们有一个字节8位的值例如 0b11010110我们想要修改其中的第 4 和第 5 位从右向左数从 0 开始但不影响其它位。
目标
确保第 4 和第 5 位被设置为 1。 步骤
定义掩码
掩码0b00110000这表示只有第 4 和第 5 位是 1其它都是 0
应用掩码
使用或运算OR来设置这两个位。原始值0b11010110掩码 0b00110000结果 0b11110110
#include stdio.hint main() {unsigned char original 0b11010110;unsigned char mask 0b00110000; // 掩码旨在设置第 4 和第 5 位unsigned char result original | mask; // 应用掩码printf(Original: 0x%X\n, original);printf(Mask: 0x%X\n, mask);printf(Result: 0x%X\n, result);return 0;
}八、C语言中的逻辑运算Logical Operation In C 区分逻辑操作和按位操作 逻辑操作的结果只有0(False)或者1(True) operator||ORAND!NOT 逻辑运算符 和 || 如果第一个参数就能确定结果就不再计算第二个参数被称作“短路评估”short-circuit evaluation
九、C语言中的移位操作Shift Operation in C
左移 k 位丢掉最高的 k 位并在右端补 k 个 0。 右移分为逻辑右移和算术右移。其中逻辑右移的逻辑和左移没啥区别一个作一个右超出的丢掉多出的补个damn0狗头
9.1逻辑右移
逻辑右移 会将数字的所有位向右移动指定的位数并在左边空出的位填充0。逻辑右移不考虑数字的符号即它仅仅是单纯地移动位并且在左边补零。
适用性 逻辑右移适用于无符号数字因为它保持了数字的二进制表达形式不变不涉及符号位的处理。
9.2算数右移
算术右移通常表示为 也会将数字的所有位向右移动指定的位数但它在左边空出的位填充的是符号位即最左边的位的副本。这意味着如果数是正的符号位为0则左边填充0如果数是负的符号位为1则左边填充1。
适用性 算术右移适用于有符号数字特别是在进行数学运算时保持符号位的一致性是非常有用的例如它可以被用来快速实现除以2的操作。
9.3示例解释
假设我们有一个字节8位数值分别为正和负 逻辑右移 正数 00101100 逻辑右移2位变为 00001011负数 10101100 逻辑右移2位变为 00101011 算术右移 正数 00101100 算术右移2位变为 00001011负数 10101100 算术右移2位变为 11101011
可以看到对于正数逻辑右移和算术右移的结果是一样的。 但对于负数算术右移保留了符号位使得移动后的结果仍然保持为负数的表达 这是数学除法的要求尤其是当向下取整时。 总结
这一章的内容比较简单主要是科普了一下一些基础概念进制内存地址逻辑运算移位运算等等。
参考文献
《深入理解计算机系统 3th 中文版》b站up主九曲阑干《深入理解计算机系统CSAPP》全书学习笔记详细 这一章直接的链接是2 信号表示和处理