目录
一.数据类型
1.1整数类型:
用于表示没有小数部分的数值。根据取值范围的不同,整数类型可以分为多种,如 short、int、long 等。
1.2浮点类型:
用于表示有小数部分的数值。常见的浮点数类型有 float 和 double
1.3字符类型:
用于表示单个字符,如 char。
1.4布尔类型:
用于表示逻辑值,只有 true 和 false 两种取值。
1.5 数据的取值范围:
有符号位(以char为例)
1 0 0 0 0 0 0 0 -128 (只有符号位为1)
1 0 0 0 0 0 0 1 -127
...
1 1 1 1 1 1 1 0 -2
1 1 1 1 1 1 1 1 -1 (所有位都为1)
0 0 0 0 0 0 0 0 0 (所有位都为0)
0 0 0 0 0 0 0 1 1
...
0 1 1 1 1 1 1 0 126
0 1 1 1 1 1 1 1 127 (所有位除了符号位都为1)
由此可知在有符号位是char可存放的值为:-128~127
无符号
0 0 0 0 0 0 0 0 0 (所有位都为0)
0 0 0 0 0 0 0 1 1
...
0 1 1 1 1 1 1 0 254
0 1 1 1 1 1 1 1 255 (所有位都为1)
无符号位可以存储的值位:0~255
二.整形在内存的存储
二.原码,反码,补码,
2.1原码
原码是最直接的表示方法。
最高位表示符号位(0表示正数,1表示负数)。
其余位表示数值的绝对值。
例如: +5的原码是00000101,-5的原码是10000101(假设是8位二进制数)
2.2反码
为了解决原码的加法和减法问题,引入了反码表示。
正数的反码与其原码相同。
负数的反码是将其原码的每位取反(0变1,1变0)。
例如; +5的反码是00000101,-5的反码是11111010(假设是8位二进制数)。
2.3补码
为了彻底解决加法和表示问题,引入了补码表示。
正数的补码与其原码相同。
负数的补码是将其反码加1
例如:+5的补码是00000101,-5的补码是11111011(假设是8位二进制数)。
补码不仅解决了加法问题,还能够自然处理负数的表示和溢出问题。在内存中是以补码的形式存放的。
三.大端与小端
3.1大端:
在大端字节序中,最高有效字节存储在最低的内存地址处,而最低有效字节存储在最高的内存地址处。这类似于我们阅读多位数字时的顺序,先读最高位。
3.2小端:
在小端字节序中,情况正好相反。最低有效字节存储在最低的内存地址处,而最高有效字节存储在最高的内存地址处。这类似于我们阅读多位数字时的顺序,先读最低位。
例如:int a=0x11223344
3.3判断大小端
代码判断:
#include <stdio.h>
int check_endian()
{
int a = 1;
char* c = (char*)&a;
return *c; // 返回最低地址处的字节值
}
int main()
{
int a = check_endian();
if (a == 1)
{
printf("该机器为小端\n");
}
else
{
printf("该机器为大端\n");
}
return 0;
}
内存观察
四. 浮点数在内存中的存储
浮点数(如 float 和 double)在内存中的存储通常遵循IEEE 754标准,这是一个广泛使用的浮点数表示法。IEEE 754标准定义了浮点数的表示方式。
4.1举例:
假设我们要存储数字5.0:
对于64位浮点数,最高位的1位存储符号位S,接着的11位存储指数E,剩下的52位存储有效数字M
符号位(S):最高位表示符号,0表示正数,1表示负数。
指数位(E):对于单精度浮点数(float),接下来的8位用于表示指数。但是,这8位并不直接存储指数值,而是存储了一个偏移量之后的值。对于float,偏移量是127(即 2^(8-1) - 1)。
尾数位(M):剩下的23位用于存储尾数的有效数字部分。但这里需要注意的是,IEEE 754标准规定了一个隐含的位,该位始终为1(除非数字是特别小的非规格化数),因此它不需要在内存中显式存储。
4.2指数E从内存中取出还可以再分成三种情况:
E不全为0且不全为1:
在这种情况下,指数E是一个正常的数,我们使用偏移量来计算实际的指数值。对于单精度浮点数(float),偏移量是127;对于双精度浮点数(double),偏移量是1023。因此,实际的指数值 = E - 偏移量。
E全为0:
表示那些非常接近0但又非零的数。
对于单精度浮点数,实际的指数值 = 1 - 偏移量 = 1 - 127 = -126。
尾数M的值不再加上隐含的1,而是直接使用存储的尾数值(即0.M)。
这种表示法允许浮点数有更大的范围来表示接近0的数。
E全为1:
在这种情况下,浮点数的表示有两种特殊情况:
如果尾数M全为0,那么浮点数的值表示为正无穷大(如果符号位S为0)或负无穷大(如果符号位S为1)。
如果尾数M不为全0,那么浮点数的值表示为“不是一个数”(NaN,Not a Number)。NaN用于表示无法表示或未定义的结果,如0除以0。