基本内置类型
char,short,int,long,long,float,double
类型的意义:1.每种类型开辟内存空间的大小不同,决定它们的使用范围不同
2.决定了看待内存空间中内容的视角,例如,把一个数存进float类型中,无论它是什么,我都把它看作float类型
值得注意的用char类型创建一个变量,不能确定是有符号char还是无符号char,不同编译器下,会有所不同
所以可以将char类型分为3种,char,signed char,unsigned char
整形在内存中的存储
整形在内存中存储的是补码,数据在内存中存储时,由于一个地址存储一个字节,如果存储大于1个字节的数据,就必然会存在将多个字节按照什么顺序存储的问题,这就引出了大端字节序存储和小端字节序存储,简称大端和小端
大端字节序存储:将一个数据的低位字节的数据放在高地址处,将一个数据的高位字节的数据放在低地址处
小端字节序存储:将一个数据的低位字节的数据放在低地址处,将一个数据的高位字节的数据放在高地址处
判断是大端还是小端
#include <stdio.h>
int main()
{
int a = 0x11223344;
if (*(char*)&a == 0x44)
printf("小端");
else
printf("大端");
return 0;
}
char类型变量的范围为何是-128~127
下面我们写出char类型补码的所有情况,共有2的8次方种
00000000 --0
00000001 --1
…
011111111 --127 2的7次方-1
10000000 – -128,由于无法计算,直接翻译成-128,-2的7次方
10000001 – -127
111111111-- -1(补码-1,符号位不变,其他位按位取反,得到原码即-1)
对于无符号位char来说,没有负数,00000000为0,11111111为2的8次方-1=255,范围为0~255
我们以此类推,对于有符号short(16个比特位)来说范围为-2的15次方到2的15次方-1
无符号short为0~2的16次方-1
例1
int main()
{
char a = -1;
signed char b = -1;
unsigned char c = -1;
printf("a=%d,b=%d,c=%d", a, b, c);
return 0;
}
对于a = -1
100000000000000000000000000000001
111111111111111111111111111111110
111111111111111111111111111111111
截断
11111111
存入a中
以%d打印
整形提升
有符号char补符号位
11111111111111111111111111111111
11111111111111111111111111111110
10000000000000000000000000000001
打印-1
对于c
11111111
整形提升
00000000000000000000000011111111
255
例二
#include <stdio.h>
int main()
{
char a = 127;
printf("%u\n",a);
return 0;
}
#include <stdio.h>
int main()
{
char a = -127;
printf("%u\n",a);
return 0;
}
-127
10000000000000000000000001111111
11111111111111111111111110000000
11111111111111111111111110000001
截断
10000001
整形提升
11111111111111111111111110000001若%u,那么把此看作正数,这就是原码,直接打印
10000000000000000000000001111110
10000000000000000000000001111111若%d,打印-127
127
00000000000000000000000001111111
0111111
00000000000000000000000001111111打印127
-128
10000000000000000000000010000000
11111111111111111111111101111111
11111111111111111111111110000000
截断
10000000
整形提升
11111111111111111111111110000000 %u,直接打印
128
00000000000000000000000010000000
截断
10000000
整形提升
11111111111111111111111110000000 %u 直接打印
所以我们看到当将128存入char a中,以%u打印,那么两次打印结果会相同