信息的表示和处理
本渣渣要进行CSAPP期中考了,但是上半学期啥也没听QWQ,只能临阵磨枪了
*学习要点*
1、计算机如何表示数字
2、其他形式数据的基本属性
*信息存储*
字节:最小的可寻址的内存单位
地址:内存中每个字节都由一个唯一的数字来标识
虚拟地址空间:所有可能地址的集合
字长:指明指针数据的标称大小(对于一个字长为w的机器而言,虚拟地址的范围为0~pow(2,w)-1,程序最多访问pow(2,w)个字节)
C语言数据类型对应字节数(32位/64位)
char/unsigned char 1/1
short/unsigned short 2/2
int/unsigned 4/4
long/unsined long 4/8
int32_t/uint32_t 4/4
int64_t/uint64_t 8/8
char* 4/8
float 4/4
double 8/8
排列表示一个对象的字节有两种方式:
- 小端法(最低有效字节在前面)
- 大端法
表示字符串:
C语言中字符串被编码为一个以NULL字符结尾的字符数组。某个字符都由某个编码标准来表示,最常见的是ASCII字符码。
布尔代数简介
二进制值是计算机编码、储存和操作信息的核心
& 与
| 或
~ 非
^ 异或
C语言支持按位进行布尔运算
掩码运算:
掩码:一个位模式,表示从一个字中选出的位的集合(掩码是一串二进制代码对目标字符串进行按位与运算,屏蔽当前的输入位)
掩码0xFF表示一个字的低位字节(eg : x&0xFF生成一个由x的最低有效字节组成的值)
~0生成一个全为1的掩码
C语言中逻辑运算:
所有非零参数都为TRUE,参数零表示FALSE
1表示TRUE,0表示FALSE
C语言中移位运算:
左移:x<<k表示x向左移动k位,丢弃最高的k位,并在右端补k个0
右移:x>>k
- 逻辑右移:在左端补k个0
- 算数右移:在左端补k个最高有效位的值
几乎所有的计算机/编译器都对有符号数使用算数右移,同时,对于无符号数,逻辑右移是必须的
*无符号数编码的定义
*补码编码的定义
有符号和无符号之间的类型转换
对于大多数C语言的实现,处理同样字长的有符号数和无符号数之间相互转换的一般规则是:数值可能会改变,但是位模式不变
U2Bw(x):在0<=x<=UMAXw时,给出x的唯一的w位无符号表示
T2Bw(x) :在TMINw<=x<=TMAXw时,给出x的唯一的w位无符号表示
补码转化为无符号数:
对满足TMINw<=x<=TMAXw的x有:
T2Uw(x) = x+pow(2,w), x<0
x, x>=0
无符号数转化为补码:
对满足0<=u<=UMAXw的u有:
U2Tw(u) = u, u<=TMAXw
u-pow(2,w), u>TMAXw
扩展一个数字的位表示
零扩展:将一个无符号数转换为一个更大的数据类型时在前面添0
符号扩展:添加最高有效位的值1
(剩下的符号太多了,不打了。。。。。。。。)