C语言进阶(一)
1、内存是线性的。
2、数据类型分类:基本数据类型,构造数据类型。
基本数据类型分为:整型,实型。
整型分为:char,short,int,long int,
实型分为:float,double,long double。
构造数据类型分为:结构体,共用体,数组,枚举,指针,构造类型。
补码
1、同样是1个字节8个位,原码表示数值范围是0-255,补码表示范围是-128-127,这说明,不同的编码规则导致不同的数据范围。
2、补码编码规则,0表示正数,1表示负数,正数的补码是他本身,负数的补码是原码各位取反后加1,-128的补码是1000 0000,-1的补码是1111 1111。
3、因为补码符号位可以和普通位参与运算,所以一般数据类型有符号数在内存都是补码形式,方便参与算术运算。
4、补码转换成10进制,只要各位取反然后按2进制计算即可。
数据类型转换
规则:
小数据赋给大数据,系统为保证数据完整性,采用符号扩充行为,
大数据赋给小数据,会发生截断行为,有可能造成数据丢失。
注意,数据在内存形式是补码形式,所以下面显示的二进制数据也是补码
小数据赋给大数据:
大数据赋给小数据(没发生数据缺失的情况):
大数据赋给小数据(发生数据缺失的情况):
基本类型之间的转换:
一般数据类型小要往大的那方转换,还有要注意unsigned int 和int 数据一起运算时,要转成unsigned int
相应习题:
打印结果是:xxxxxxx
解题思路:
首先b要转换成unsigned int,b的补码形式是
1000 0000 0000 0000 0000 0000 0110 0100
上面的数据按无符号数计算,结果为非常大的正整数所以再加上a结果肯定大于a.
打印结果是:ooooooo
解题思路:
和上面类似,-1的补码是 ff ff ff ff,在加上a会溢出变为负数,所以结果比a小。