重点
整型与浮点数的存储。
数据类型
意义
2)在内存空间如何存储。
实例
int main()
{
int a = 10;
float b = 10.0;
short c = 10;
char d[] = "10";
return 0;
}
1个字节为8个bit位,转化为十六进制位2的8次幂=16的二次幂,也就是十六进制的两位,所以内存中以2位表示一个字节。
内存中,整型都是以补码形式存储,因为cpu硬件只有加法器
实例
计算 1+(-1)=0
数字1 :00000000 00000000 00000000 00000001(补码)
数字-1 : 11111111 11111111 11111111 11111111(补码)
结果 : 10000000 00000000 00000000 00000000
进一位 : 0000000 00000000 00000000 00000000
1.大端存储模式与小端存储模式
大端:数据的低位保存在内存的高地址,数据的高位保存到内存的低地址。
小端:数据的低位保存在内存的低地址,数据的高位保存到内存的高地址。
实例
数字20,整型会向内存四个字节,以16进制表现为:00 00 00 14
二进制表示 | 大端存储(内存地址) |
00 高位 | 14 高地址 |
00 | 00 |
00 | 00 |
14 低位 | 00 低地址 |
二进制表示 | 小端存储(内存地址) |
00 高位 | 00 高地址 |
00 | 00 |
00 | 00 |
14 低位 | 14 低地址 |
实例
int main()
{
int a = 19;
int* ap = &a;
char* app = (char*) & a;
printf("%d\n", *app);
return 0;
}
指针类型决定了指针解引用访问几个字节。(int型指针访问4个字节,char型访问1个字节)
指针类型决定了指针+1的步长 (决定步长)
强制转化后,用char形指针接收int型数据,则char型指针只会访问int型数据的首个字节,这就是实现大小端存储判断的原因。
2.char型数据详解
char型数组会像内存中请求1个字节储存
有符号位的char
内存存储(补码) | ± | 原码 | 十进制表示 | 整型提升(对补码) | 整型提升后的原码 | 整型提升后原码的十进制表示(略) |
00000000 | + | 00000000 | 0 | 00000000 00000000 00000000 00000000 | ||
00000001 | + | 00000001 | 1 | 00000000 00000000 00000000 00000001 | ||
00000010 | + | 00000010 | 2 | 00000000 00000000 00000000 00000010 | ||
..... | + | ..... | ... | ... | ||
..... | + | ..... | ... | ... | ||
01111110 | + | 011111110 | 126 | 00000000 00000000 00000000 01111110 | ||
01111111 | + | 011111111 | 127 | 00000000 00000000 00000000 01111111 | ||
10000000 | 特殊 | -128 | 11111111 11111111 11111111 10000000 | |||
10000001 | - | 11111111 | -127 | 11111111 11111111 11111111 10000001 | ||
...... | - | ... | ... | ... | ||
...... | - | ... | ... | ... | ||
11111110 | - | 10000010 | -2 | 11111111 11111111 11111111 11111110 | ||
11111111 | - | 10000001 | -1 | 11111111 11111111 11111111 11111111 |
无符号位的char
内存存储(补码) | ± | 原码 | 十进制表示 | 整型提升 |
00000000 | + | 00000000 | 0 | |
00000001 | + | 00000001 | 1 | |
00000010 | + | 00000010 | 2 | |
..... | + | ..... | ... | |
..... | + | ..... | ... | |
01111110 | + | 01111110 | 126 | |
01111111 | + | 01111111 | 127 | |
10000000 | + | 10000000 | 128 | |
10000001 | + | 10000001 | 129 | |
...... | + | ... | ... | |
...... | + | ... | ... | |
11111110 | + | 11111110 | 254 | |
11111111 | + | 11111111 | 255 |
实例
int main()
{
char a = -1;
signed char b = -1;
unsigned char c = -1;
printf("%d\n%d\n%d\n", a, b, c);
return 0;
}
结果
-1
-1
255
a的原码 1000 0001
a的反码 1111 1110
a的补码 1111 1111
a的隐形整型化(补码为int型)
11111111 11111111 11111111 11111111
a整形后的原码
11111111 11111111 11111111 11111110
10000000 00000000 00000000 00000001
整型打印为-1.
同理可得 signedchar整形后打印值也为-1.
补充:char的定义
C标准中对char是 Impementation Defined,就是未明确定义
(1)那它由什么定义?坦白说,具体的编译器明确定义,一般都是用signed char或unsigned char来实现char的,也就是说不同的编译器对char是什么定义不一样
(2)为什么要这样定义?因为这三种类型的对象在存储介质中的表现形式是一样的(都是一个占8bit的01串,只是解析的时候不同)
(3)到底是signed char还是unsigned char?这得看编译器:VC编译器、x86上的GCC都把char定义为signed char,而arm-linux-gcc却把char定义为 unsigned char
对于unsigned类型
c的原码 1111 1111(0-1后溢出再截取)
c的反码 1111 1111
c的补码 1111 1111
c的隐形整型化(补码为unsigned int型)
00000000 00000000 00000000 11111 1111
整型打印百分制为255.
实例
int main()
{
char a = -128;
printf("%u\n", a);
return 0;
}
结果
4294967168
a的原码 1111 1111
a的反码 1000 0000
a的补码 1000 0001
a的整型化(默认整型化为int型)
11111111 11111111 11111111 1000 0001
打印为unsigned int型
4294967168
在内存中,char 与unsigned char没有什么不同,都是一个字节,8个bit,普通的赋值,读写文件和网络字节流都没什么区别,反正就是一个字节,不管最高位是什么,最终的读取结果都一样,只是你怎么理解最高位而已。
无符号位char型补的都为0,而带符号位char型补的为符号位。
3.float型数据详解
S EEEEEEEE FFFFFFFFFFFFFFFFFFFFFFF
S:符号位,正数时为0,负数时为1
E:指数位
F:有效数字,大于1小于2,因为前面必有1,所以FFFFFFFFFFFFFFF存储的仅为小数部
注:E为指数,但有可能为负值,但在IEEE中规定E为无符号数(以float为例)。即在E区只能存储0~255这256个整数。为了区分正负,用中间数127(double类型为1023)作为分界点,当指数位为-1时,加上127在E区存储126,同理当指数位为-126时,在E区存储值1.所以实际上能存储的指数值为-127~128.
实例
int main()
{
float a = -5.5;
//S = 1;
//去除正负号后的二进制表示:101.1
//101.1=1.011*2^2
//E存储指数位 2+127 = 129
// 转化为二进制 1000 0001
//F存储有效数字的二进制小数位 0.11 补为23位 0110 000000000
//则内存存储为: 1 1000 0001 0110 000000000
// 11000000101100000000000000000000
//1100 0000 1011 0000 0000 0000 0000 0000
// c 0 b 0 0 0 0 0
// c0 b0 00 00
return 0;
}
结果
注意为大端存储
所以低地址存低位高地址存高位。
特例
E区全为0
即指数取到-127,默认根据符号位只取±0
E区全为1
即指数取到128,默认根据符号位只取±∞
标签:11111111,存储,00000000,char,int,day17,整型,数据 From: https://blog.51cto.com/u_15862591/5893732