目录
一.C语言中强制类型转换
1.无符号数与有符号数:不改变数据内容,只是改变了计算机的解释方式
例如下图,短整型转为无符号短整型再赋值给y,y=x=1110 1111 0001 1111,只是计算机在解析真值时会以无符号数的规则进行解析。
2.将长整型变短整型:则将高位截断,保留低位。
例如下图,a用16进制表示为0x000286a1,强制类型转换后为0x86a1,即c=0x86a1,计算机用16bit补码的方式将其解析为真值,即-31071。b转换为d同理:
3.短整数变长整数:符号扩展
① 有符号数
由于定点整数的小数点在数的末尾,所以,若定点整数的补码是负数,则在符号位和原有的数值位之间填充"1"(正数则填充"0"),用这样的方式得到的补码,解析为真值,值是不变的。
例如下图,短整型x转换为长整型n,由于x是负数,所以在符号位后填充"1"
再看n,将短整型强制转换为无符号短整型,再赋值给n。这时计算机会把x的二进制值赋值给n,再以无符号数的规则解析出真值。
**② 无符号数:**若原数字是无符号数,扩展后高位用0填充。
例如下图,将无符号短整型n转换为无符号整型p,高位填充"0"即可。
二.数据的存储方式
1.大小端模式
对于某个4字节的int变量:0123 4567 H,其最高有效字节(MSB)为01(1个字节8bit),最低有效字节(LSB)为67。多字节数据在内存里一定是占连续的几个字节的,根据数据在内存中的存储方式不同,可以分为大端方式和小端方式。
大端方式: 将更高的有效字节存到更低地址中,这样的存储方式便于人类阅读。
下图所示的0800H,0801H指的是内存地址:
小端方式: 将更低的有效字节存到更低地址 中,便于机器的处理。机器读多字节数据时是从低地址读到高地址的,采用小端方式,最先读到的是67。当CPU对两个int型变量进行加法操作的时候,也是应该先从最低有效字节进行加法。
2.边界对齐
现代计算机通常是按字节编址 ,即每个字节对应1个地址。通常也支持按字、按半字、按字节寻址:假设存储字长为32位,则1个字=32bit,半字=16bit。每次访存只能读/写1个字(也就是读取一整行,不能跨行读取)。
无论是按半字还是字寻址,字地址,半字地址最终都要转化为字节地址。
这里1个字=4个字节,当给出了要访问的数据的字地址时,怎么将其转化为与之对应的字节地址: 只需要将字地址逻辑左移两位即可,因为逻辑左移1位表示*2,逻辑左移两位表示*4。例如要访问2号字,2的二进制表示为10,逻辑左移两位后得到:1000(8),所以2号字的其实地址就是8号字节。半字地址的操作同理,只需要逻辑左移一位即可。
有的计算机会采取数据边界对齐的方式:
而有的计算机中会采取边界不对齐的方式:
例如,c语言中,char占1个字节,short占两个字节,int占4个字节。现在定义一个结构体,这个结构体包含3个char型变量,3个short型变量和1个int型变量。
**对于对齐方式而言,**当存储完3个char型变量后,会剩下1个字节的空间,这1个字节的空间不足以存放short和int,所以这个字节的空间不会存放任何数据。
对于不对齐的方式而言,存储完3个字节后,可以将第4个字节的空间用于存放short型变量的第1个字节,将第2行的第1个字节的空间用于存放short型变量的第2个字节。
总结:
如果利用不对齐的方式存储数据 ,当读出这个short型变量时,需要进行2次访存。只有将两个字的内容都读入,并且将第一行short的内容和第二行short的内容进行拼接,才能得到short型变量的完整表示。
而采用对齐方式存储数据,虽然存在一些空间的浪费,但是读入short型变量时,只需要进行1次访存。因为这个变量的所有数据都只存放在1个字中。