整数有三种二进制表示形式
原码:本身
反码:符号位不变 其他按位取反
补码:反码+1
(正数原反补相同)
不同的数据类型有不同的范围
比如对八个比特位的字符型变量char就是从-128~127,即0000 0000~1111 1111。
注意:根据二进制数据的增加特点,从0000 0000即0开始逐渐+1,加到0111 1111即127后,会变成1000 0000,取原码后得到-128,然后是1000 0001原码是-127,最后到1111 1111即-1
而unsigned char范围是0~255
注意:因为取值只能到255,所以用unsigned char设置循环条件要注意不能超过255,否则永远达不到回造成死循环
浮点型和整型在内存中的存储方式不一样
float类型32位 double64位也是大同小异的
符号位1个,指数位8个,科学计数位23个。其中指数位要加上127
如对9.0,二进制为1001.0,小数点左移三位 1.001*2^3
则符号位为0,指数位为1000 0001(3+127=130),科学技术位为00100000 00000000 0000000
大小端字节序
对于多字节的数据类型如int,float,在不同的系统环境里字节的排序不太一样,有大端和小端两种
大端字节序就是低字节的数据存储在高地址,小端字节序反之
如对int类型的一个六进制数0x11223344,低地址的字节应该是44,然后依次为33 22 11
若以大端存储,在内存中就会展示为11223344
若以小端存储,在内存中就会展示为44332211
//测试系统的字节序
int main()
{
int n = 1;
char p = (char)n;
if (p == 1)
printf("小端");
else
printf("大端");
return 0;
}
整型提升
计算机计算实在CPU上的ALU(运算器)进行
数据在运算时显示存储在Register(寄存器)中
而ALU在被设计时候就是设计为4个字节为单位进行计算,Register自然也是跟随ALU的规则
所以当有运算进行时候,不满足4个字节的数据(char short)会进行整形提升,规则如下
Ⅰ:无符号的直接补0
Ⅱ:有符号的按符号位补
//char类型的符号位是最高位(第8个二进制位)
//->对char a = 128,(1000 0000)因为最高位为1,所以整型提升会补1