第二章 信息的表示和处理

 这一章主要讲解了数据的分类和运算,以及运算时的公式。

要点一:

每台计算机都有一个字长,用来指明整数和指针数据的标称大小。而虚拟地址是以这样的字来编码,因此,字长决定了虚拟地址空间的大小。例如,如果一个字长为n位的机器,虚拟地址的范围为:0~(2^n)-1的大小。

除了虚拟地址,计算机工作的时候还会有数据。同时,存储数据也需要空间,如果能够了解他们的字长,就更好了。以下表以字节为单位:

c声明

32

64

char

1

1

short int

2

2

int

4

4

long int

4

4

char *

4

8

float

4

4

double

8

8

需要注意的是,随着64位机器普及,以前在32位上的程序如果直接移植到64位上,会暴露出一些隐藏的对字节的依赖。例如,许多程序员假设一个声明位int类型的程序对象能被用来存储一个指针。这在大多数32位的机器工作正常,但是在一台Alpha(64位)机器上却会导致问题。至于出问题的原因,可能是机器指令工作应该是不太一样或者机器本身就不允许一个内存地址给到这样一个变量。

要点二:

那么存入数据也会有方式,但是在了解存入方式之前,可以先了解有效字节。

假如有一个w位的整数,就有[Xw-1...... Xw0 ] 位,其中,Xw-1位为最高有效位。如果w是8的倍数,则可以分组成字节,这个时候,[Xw-1 ...... Xw-8] 为最高有效位。

存入数据的方式有两个规则:小端法和大端法。举例存入 0x012345 到地址 0x100 具体区别如下:

大端法:(最高有效位在前)

0x100

0x101

0x102

...

01

23

45

...

小端法:(最低有效位在前)

0x100

0x101

0x102

...

45

23

01

...

其中采用小端法的机器有Intel,大端法的机器有IBM、Motorola、Sun Microsystems。

题目

1、

 

A:小端法:21  大端法:87

B:小端法:21 43 大端法: 87 65

C:小端法:21 43 65  大端法: 87 65 43

要点三:

我觉得比较值得注意的是无符号和有符号之间的转化(总是让我联想到整数溢出,挺有意思的)

无符号二进制:

 

补码:

 

但是。。。补码我还是比较推荐简便的方法:符号位不变,其他位取反再加1,无符号就是一个数的绝对值用二进制表示。例如1111如果是无符号数就是15,如果是有符号就是-7

C支持所有整形数据类型的有符号数和无符号数运算。尽管C标准并没有指定某种有符号数的表示,但是几乎所有的机器都使用二进制补码。通常,大多数数字默认都是有符号的,C也允许无符号数和有符号数之间的转换,转换原则是基本的位表示保持不变。因此在一台二进制补码机器上,当从无符号数转换为有符号数时,效果就是应用U2Tw,而从有符号转换为无符号数时,就是应用函数T2Uw,其中w表示数据类型的位数。

这么说可能还是迷糊,计算机是一门实践专业,所以咱们拿例子说话:-12345的16位二进制补码表示就和53191的16位无符号表示相同。因此,T2U16(-12345)即无符号数为53191,反过来,U2T16(53191)即有符号数为-12345

要点四:

无符号加法:例如,9+12=[1001]+[1100]=21=[10101],这个时候,如果空间不够,就会舍弃最高位,变成[0101],结果就和 (9+12)mod 16 相同。

补码加法:

 

看起来很复杂,其实就是先把加数转化为无符号的数相加再转回来,最后mod最多能够有的位数w,16位就mod16,32就mod32,以此类推。

乘法的做法类似加法,把加号改为乘号就行。那除法呢?

要点五:

整数除法通过除以2的幂进行。

无符号逻辑右移k位等价于把它除以2^k。

对于补码的逻辑右移,非负数时按照无符号一样算就可以,但是负数就不一样了。即,当[x/y]时,应该为:[(x+y-1)/y]

要点六:

当在 int、float 和 double格式之间进行强制类型转换时,程序按照如下原则来转换数值和位模式(假设int是32位的):
从int转换成float,数字不会溢出,但是可能被舍入。
从 int 或float转换成double,因为double有更大的范围(也就是可表示值的范围),也有更
高的精度(也就是有效位数),所以能够保留精确的数值。
从double转换成float,因为范围要小一-些,所以值可能溢出成+oo或-o。另外,由于精确
度较小,它还可能被舍入。
从float或者double转换成int,值将会向0截断。例如,1.999将被转换成1,而-1.999将
被转换成-1。注意这种行为与舍入是非常不同的。进一步来说,值可能会溢出。C标准没有对这种情况指定固定的结果,但是在大部分机器上,结果将是TMaxw。 或TMinw,,其中w是int中的位数。

要注意转换时的溢出问题,有时候会造成很大的错误。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值