csapp

大多数计算机使用8位的块,或者字节(byte),作为最小的可寻址的内存单元,而不是单独访问内存中单独的位。机器级程序将内存视为一个非常大的字节数组,成为虚拟内存,所有可能地址的集合就称为虚拟内存地址。
一个字节(byte)有8位(bit)组成。
十六进制
在C语言中,以0x或0X开头的数字常量被认为是十六进制的值。字符‘A’到‘F’可以是大写或者小写。十六进制到十进制,到二进制的转换已经在数字逻辑中学习过了,很简单。
练习题2.1
A。将0x39A7F8
B。将二进制1100100101111011转换为16进制。
C。将0xD5E4C转换为二进制。
D。将二进制1001101110011110110101转换为16进制。
非常简单,略
练习题2.2
给了一种简便算法,用处不大。
练习题2.3
很简单
练习题2.4
逢16进1,不会的话化为十进制再计算。注意分清题目的数是十进制还是十六进制。
每台计算机都有一个字长,致命指针数据标称的大小。因为虚拟地址是以这样的一个字来编码的,所以字长决定了虚拟地址空间的最大大小。比如,一个机器字长为w位,那么虚拟地址的范围为0~ 2 w − 1 2^w-1 2w1,程序最多访问 2 w 2^w 2w个字节。比如,对于32位的机器,它的字长为32,那么它的限制虚拟地址空间为4千兆字节,也就是4GB。
来自上课用的ppt
上图是基本C数据类型的典型大小(以字节为单位)。
C的数据类型char表示一个单独的字节,但它也能被用来储存整数值。
在这里插入图片描述
为了避免由于依赖“典型”大小和不同编译器设置带来的奇怪行为,ISO C99引入了一类数据类型,其数据大小是固定的。
上图所示的并不是什么新的数据类型,而是通过typedef定义的,只是为了便于移植。uint 8_t不是unsigned int,而是char。
在几乎所有的机器上,多字节对象都被存储为练连续的字节序列,对象的地址是所使用的字节中最小的地址。例如,假设一个类型为int(32位)的变量x的地址为0x100,即地址表达式&x的值为0x100,那么x的4个字节将被存放到0x100,0x101,0x102,0x103位置。
排列表示一个对象的字节有两个通用的规则。
在这里插入图片描述
在这里插入图片描述
练习题2.5
十六进制字节序列(为什么要两个两个分开,因为一个十六进制的位表示成二进制是4位,那么两个十六进制位就是二进制的8位了,也就是一个字节(byte))
87 65 43 21
小段法首先取低字节放入内存,所以为21
大端法首先取高字节放入内存,所以为87
接下来都会写了。
练习题2.6
A。把每一位用8421BCD码表示即可
B。自己动手实试一试
C语言中字符串被编码为一个以null(其值为零)字符结尾的字符数组。每个字符都由ASCII字符码(最常见)来表示。如果以参数“12345”(5位)和6(包括终止符)
来运行例程show_bytes,我们得到 31 32 33 34 35 00,终止字节的十六进制表示为0x00.
练习题2.7
注意,strlen(s)为6,也就是函数读到f字符就停止了,不会读到终止符。所以输出为61 62 63 64 65 66
布尔代数简介
非 与 或 异或,离散数学和数字逻辑都讲过了。
在这里插入图片描述
我们可以将上述4个布尔运算拓展到位向量(Bit Vectors)的运算。
在这里插入图片描述
练习题2.9
布尔运算在物理中的一个应用,很简单
C语言中的位级运算
在这里插入图片描述
练习题2.10
考察了异或的运算
练习题2.11
最后一次循环,当然为中间值啦,为k。
我们来看inplace_swap,参数x和y都指向k,当计算*x^*y时,我们会得到0.
正如答案所说,我们没有必要比较正中间的值,所以把<=改为<就可以啦。
练习题2.12

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值