CSAPP-第二章信息的表示和处理

目录

2.1信息存储

2.1.1十六进制表示法`

2.1.2字数据大小

2.1.3字节顺序(了解性知识,在网络编程会用到一般可以忽视)

2.1.4布尔代数

2.1.5位移运算符

2.2整数的表示

2.2.1整数表示方法

2.2.2有符号数和无符号数的转换

2.2.3扩展一个数字的位数

2.2.3整数的运算

2.3浮点数的表示


2.1信息存储

2.1.1十六进制表示法`

十六进制表示法是使用0~9和A~F来表示的其中A表示10,B表示11,C表示12以此类推详细的转换情况如下表:

十进制十六进制二进制十进制十六进制二进制
000881000
111991001
221010A1010
331111B1011
4410012C1100
5510113D1101
6611014E1110
7711115F1111

2.1.2字数据大小

一个字节有8位,一个字根据CPU的字长来决定如果是32位一个字就是4字如果是64位就是8字节。

一个指针所占存储空间的大小就是一个字。

对于程序也有32位和64位之分主要却别是其各数据类型所占的大小略有不同,以C语言基本数据类型为例如下表:

C声明字节数
有符号无符号32位64位
[signed] charunsigned char11
shortunsigned short22
intunsigned int44
longunsigned long48
int32_tuint32_t44
int64_tuint64_t88
char*48
float44
double88

2.1.3字节顺序(了解性知识,在网络编程会用到一般可以忽视)

对于字节顺序有两种规则一种是小端法即最低有效字节在最前面,另一种是大端法即最高有效字节在最前面这里以0x01234567为例:

大端法:

......0x1000x1010x1020x103......
......01234567......

小端法:

                

........0x1000x1010x1020x103........
.......67452301.......

大多数使用Intel的CPU的计算机只用小端模式。另一方面IBM和Oracle的大多数计算机则是按大端模式操作。不过现在基本上只有Intel和AMD两个CPU生产厂商因此基本上都是采用小端法来进行操作,不过比较新的微处理器是双端法但是实际情况是真正运作时也只能运行其中一种大多数也只是采用小端法进行操作寻址。

2.1.4布尔代数

布尔代数就是常见的各种逻辑运算符和对应的算子的操作其中0表示false,1表示true(实际上除0以为的所有数都为true)这里以C语言位例来表示:

双目运算符
运算符0 00 11 1
&001
|011
&&001
||111
^010
运算符0x000x1001
!不能使用不能使用10
~0xff0xef10

&运算就是有0得0可以进行位运算

|运算就是有1得1可以进行位运算应用的比较多一般都是用来合并多个权限的。

^运算是相同位0不同为1可以进行位运算其结果按照运算结果来判定&和|也是如此而不是只有0和1两种结果搞嵌入式硬件用的比较多。

2.1.5位移运算符

位移运算符有两个一个是左移运算发<<一个是右移运算符>>,左移运算符相当于乘2的次方,右移运算符相当于除2的次方。

以x为例x的值为0x10结果如下表(这里都为算术移动):

        

操作结果
x<<40x100
x>>40x01

下面介绍一下逻辑移动对于左移逻辑和算术结果相同所以就没必要列举所以着重讲解右移的逻辑右移。

逻辑右移主要是用来处理有符号整数的因为对于有符号整数其数据表示采用补码来进行。

什么是补码呢?

所谓补码就是指数据位数的表示在某种情况以一种方式计算无法表示而补码对于无符号整数的表示有很大的作用对于0以上的数一般以十进制数对应的二进制数的转换结果来表示但是对于负数这样的做法就不行因此在补码上以最高位表示负数比如对于-8其二进制表示就是1000,同时1000还能表示8,以补码的方式各个位上的数全为1时这个数就是-1;

那逻辑右移又是怎么移动的呢?

逻辑右移是根据最高位的位数来进行移动的最高为1则补1,为0则补0。

例子如下:

令x=1000(注意是二进制表示)

x>>2=1110即移动后x为-2;因为-8/2^2=-2所以结果正确

假设如果

x>>2=0010即进行算术右移其结果为2符号位为正所以错误。

这就是逻辑右移的作用。

2.2整数的表示

2.2.1整数表示方法

通过对补码的认识整数的表示应该有一个大概理解

对于有符号整数所采用的是正码表示即所有位都按二进制转十进制的方法来算。

对于无符号数则采用补码的方式即最高位以负数的形式表示

下面是关于C语言各类整型数据所表示范围的一个表:

32位程序的取址范围
C数据类型最小值最大值
[signed] char-128127
unsigned char0255
short-3276832767
unsigned short065535
int-21474836482147483467
unsigned04294967295
long-21474836482147483467
unsigned long04294967295
int32_t-21474836482147483467
uint32_t04294967295
int64_t-92233720368547758089223372036854775807
uint64_t018446744073709551615

64位程序的取址范围
C数据类型最小值最大值
[signed] char-128127
unsigned char0255
short-3276832767
unsigned short065535
int-21474836482147483467
unsigned04294967295
long-92233720368547758089223372036854775807
unsigned long018446744073709551615
int32_t-21474836482147483467
uint32_t04294967295
int64_t-92233720368547758089223372036854775807
uint64_t018446744073709551615

2.2.2有符号数和无符号数的转换

有符号数和无符号数主要差别在其编码方式因此转换也相对便于理解即把有符号数的最高位转化为 正数即在运算时作为正数而不是负数来计算。

如-1转换为无符号数将会变得所转换位数能表示的最大数因为-1的二进制是所有位数都为1.

2.2.3扩展一个数字的位数

扩展一个数字的位数主要是用来进行向上准换也就是向存储空间更大的类型转换

有两种扩展方式;

一个是零扩展即在高位补0主要用于无符号数的扩展

另一个是符号扩展即在高位补1是用于有符号数的扩展

2.2.3整数的运算

加法就是加法运算执行效率高

减法进行逆元元素即加法变减法执行效率高

乘法表左移操作分别拆分为2的次方数然后进行加减运算

除法和乘法基本相同但是除法是通过右移实现

2.3浮点数的表示

首先浮点数不区分有无符号

其在内存上分为三块即

整数位,符号位,小数位

小数位是以2的负次方来表示然后进行加操作其结果有一定的误差所以显示出来的是个近似值而不是实际值比如:

0.1+0.2=0.30000040;

至于其运算和整数大体相同

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值