一,整形家族:
char (unsigned char) (signed char)
short (unsigned short) (signed short) [int]
int (unsigned int) (signed int)
long (unsigned long) (signed long) [int]
数据在计算机中都以二进制方式存储
整数的二进制分3种表示形式:原码,反码,补码
正整数的原反补码相同
负数原码符号位取1,其余位与其绝对值的取值表现形式相同
反码:在原码基础上,符号位不变,其余位按位取反
补码:在反码基础上,加1可得补码
以int(32位)类型-1为例:
原码:10000000000000000000000000000001
反码:11111111111111111111111111111110
补码:11111111111111111111111111111111
为什么要使用补码的形式来进行存储?
因为计算机通常以加法的方式进行算术运算,不使用减法,所以负数需要通过补码的方式来参与运算。
二,大端小端存储:
当存储空间大于一个字节时,需要用到大小端存储的知识。
大端存储模式,是指数据的低位保存在内存的高地址中,数据的高位,保存在内存的低地址中。
小端存储模式,是指数据的高位保存在内存的低地址中,数据的低位,保存在内存的高地址中。
例如: 假设内存以从左向右,由低地址向高地址的存储
定义一个整形a = 0x11223344
则以大端存储中的存储信息显示: 11 22 33 44
小段存储显示 44 33 22 11
设计一个程序判断当前计算机是大端字节序还是小端字节序
int a = 1; //定义int整形占4字节,char类型占一个字节
char* pa = (char*)&a; //用char类型取出地址a开始第一个字节中的内容
if (* pa == 1) //如果*pa取出1,则证明内存中a的存储是 01 00 00 00
printf("是小端\n");
else //如果*pa取出0,则证明内存中a的存储是 00 00 00 01
printf("是大端\n");
三、整形提升和截断
整形提升:表达式中的字符(char)和短整型(short)操作数在使用之前会被替换成普通整形,提升时高位补充符号位。
1、判断输出 //先整型提升相加,截断存放,再整型提升c,求原码输出
char a = 3; //a提升后000000000000000000000000 00000011
char b = 127; //b提升后000000000000000000000000 01111111
char c = a + b; //相加后 000000000000000000000000 10000010
//c截断后10000010
//c提升后111111111111111111111111 10000010
printf("%d", c); //求原码得-> -126
//给字符赋值数字需先将该整形数字截断,再进行存放
//b和a的值被提升为普通整型,然后再执行加法运算
//加法运算完成后结果被截断,存储与c中,因为%d是取整形,所以最后再次整形提升输出
2、判断输出
char a = -128; //000000000000000000000000 10000000截断得 10000000
printf("%u\n", a); //这里%u输出unsigned int整形
//输出int类型应先对a进行整形提升操作: 111111111111111111111111 10000000
由于输出无符号类型,所以补码 = 原码,输出一个很大的数字