CSAPP-第二章

CSAPP-第二章,第1张

第二章:信息的表示和处理

整数的表示虽然只能编码一个相对较小的数值范围,但是这种表示是精确的

浮点数虽然可以编码一个较大的数值范围,但是这种表示只是近似的

信息存储

大多数计算机使用8位的块,或者字节(byte),作为最小的可寻址的内存单位

机器级程序将内存视为一个非常大的字节数组,称为虚拟内存。内存的每个字节都有一个唯一的数字来表示,称为它的地址,所有可能地址的集合就称为虚拟地址空间

C语言中一个指针的值是某个存储块的第一个字节的虚拟地址。

每个程序对象可以简单地是为一个字节块,而程序本身就是一个字节序列

十六进制

十进制转十六进制

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MkU5RxDX-1652024912871)(C:\Users\83989\AppData\Roaming\Typora\typora-user-images\image-20220426172212323.png)]

十六进制转十进制

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ICmIPGHZ-1652024912872)(C:\Users\83989\AppData\Roaming\Typora\typora-user-images\image-20220426172227859.png)]

字数据大小

字长:每个字所包含的位数

字长决定虚拟空间的最大大小,对于一个字长为w位的机器而言,虚拟地址的范围为:0~2的w次方-1,程序最多访问2的w次方个字节

我们将程序称为32位程序或64位程序,区别在于该程序是如何编译的,而不是器运行的机器类型

32位机器与64位机器表示的就是虚拟地址空间,大多数64位机器也可以运行32位机器编译的程序,这是一种向后兼容

1kb=1024字节

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-h6bAfXIt-1652024912873)(C:\Users\83989\AppData\Roaming\Typora\typora-user-images\image-20220426173715881.png)]

char也能用来存储整数值

大多数数据类型编码默认为有符号型

寻址和字节顺序

在几乎所有的机器上,多字节对象都被存储为连续的字节序列,对象的地址为所使用字节中最小的地址

表示字符串

C语言中字符串被编码为一个null(其值为0)字符结尾的字符数组。终止字节的十六进制表示为0x00

位级运算

确定一个位级表达式的结果最好的方法,就是将十六进制的参数扩展成二进制表示并执行二进制运算,然后再转换回十六进制

移位运算 左移

x< 右移

x>>k

逻辑右移:在左端补k个0

算术右移:在左端补k个最高有效位的值

几乎所有的编译器/机器组合都对有符号数使用算术右移

对于无符号数,右移必须是逻辑的

整数表示 原码

原码就是机器码。
1的原码是0000 0001,-1的原码是1000 0001

补码编码

为什么存在补码:希望只有一个0

最高有效位位符号位,符号位被设置为1时,表示值为负,设置为0时,表示值为非负

对于补码0001:十进制为1

对于补码1111:(-1*2的三次方+1 * 2的平方+1 * 2的一次方+1 * 2的零次方= -1

补码=反码+1

反码

正数的反码是其本身。
负数的反码是其原码除符号位以外其余各位按位取反。-5的反码是1111 1010。

为什么使用原码、反码和补码

原码、反码、补码之间的相互关系 - xfcao - 博客园 (cnblogs.com)

有符号数和无符号数之间转换

强制类型转换的结果保持位置不变

补码转换为无符号数

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9LaQ0PiM-1652024912874)(C:\Users\83989\AppData\Roaming\Typora\typora-user-images\image-20220503164840210.png)]

无符号数转换为补码

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1BPEPKgu-1652024912875)(C:\Users\83989\AppData\Roaming\Typora\typora-user-images\image-20220503165040147.png)]

C语言中的有符号数和无符号数

创建一个无符号常量,必须加上后缀字符‘U’或‘u’

当执行一个运算时,如果它的一个运算数是有符号的而另一个是无符号的,那么C语言会隐式的将有符号参数强制类型转换为无符号数,并假设这两个数都是非负的,来执行这个运算

扩展一个数字的位表示

一个常见的运算是在不同字长的整数之间转换,同时又保持数值不变

要将一个无符号数转换为一个更大的数据类型,我们只要简单地在表示的开头添加0,这种运算被称为零扩展

要将一个补码数字转换为一个更大的数据类型,可以执行一个符号扩展,在表示中添加最高有效位的值

符号扩展保持数值不变

补码截断要将最高位转换为符号位

整数运算 无符号数加法

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-g2dBcZig-1652024912876)(C:\Users\83989\AppData\Roaming\Typora\typora-user-images\image-20220503165834029.png)]

检测无符号数加法中的溢出

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AbPCtUcl-1652024912877)(C:\Users\83989\AppData\Roaming\Typora\typora-user-images\image-20220503165958869.png)]

无符号数求反

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ByjiLTmw-1652024912878)(C:\Users\83989\AppData\Roaming\Typora\typora-user-images\image-20220503170055949.png)]

补码加法

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AT3MdKh8-1652024912878)(C:\Users\83989\AppData\Roaming\Typora\typora-user-images\image-20220503170134374.png)]

补码的非

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-incofbjk-1652024912879)(C:\Users\83989\AppData\Roaming\Typora\typora-user-images\image-20220503170225549.png)]

无符号数乘法

对于两个w位的无符号数,无符号数乘积的取值范围可能需要2w位来表示,不过C语言中的无符号乘法被定义为产生w位的值,就是2w位的整数乘积的低w位表示的值

相当于截断

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hhHZ7Q4w-1652024912880)(C:\Users\83989\AppData\Roaming\Typora\typora-user-images\image-20220503170510735.png)]

补码乘法

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CMwpLJ6Y-1652024912881)(C:\Users\83989\AppData\Roaming\Typora\typora-user-images\image-20220503170927417.png)]

乘2的幂

在右边增加k个0

除以2的幂

除以2的幂也可以用移位运算来实现,只不过我们用的是右移而不是左移,无符号和补码数分别使用逻辑移位和算术移位来达到目的

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XDGuEV6w-1652024912882)(C:\Users\83989\AppData\Roaming\Typora\typora-user-images\image-20220503171600949.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kUjtuN56-1652024912883)(C:\Users\83989\AppData\Roaming\Typora\typora-user-images\image-20220503171825978.png)]

不加修正为向下舍入,加修正为向上舍入

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-noEOUsbl-1652024912884)(C:\Users\83989\AppData\Roaming\Typora\typora-user-images\image-20220503171718349.png)]

浮点数 二进制小数

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uiWpYDLN-1652024912884)(C:\Users\83989\AppData\Roaming\Typora\typora-user-images\image-20220503172026426.png)]

二进制小数点向左移动一位相当于这个数被2除

二进制小数点向右移动一位相当于将该数乘2

小数的二进制表示法只能表示那些能够被写成x乘2的y次方的数,其他的值只能被近似地表示

增加二进制表示地长度可以提高表示的精度

IEEE浮点数表示

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Z8W8yq2U-1652024912885)(C:\Users\83989\AppData\Roaming\Typora\typora-user-images\image-20220503172814393.png)]

浮点运算

定义1/-0将产生负无穷

定义1/+0将产生正无穷

浮点加法不具有结合性

从float或者double转换成int,值将会向0舍入,1.999将被转换成1,-1.999将被转换成-1

C语言中的浮点数

大多数机器对浮点数使用IEEE标准754编码,但C语言中没有明确的标准

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/874749.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-13
下一篇 2022-05-13

发表评论

登录后才能评论

评论列表(0条)

保存