目录:
1、整数在内存中的存储
2、大小端字节序
2.1、什么是大小端?
2.2、什么是 "高/低位字节" 和"高/低地址 " 呢?
练习1
练习2
3、浮点数在内存中的存储
正文
1、整数在内存中的存储
整数的二进制表示方法有:原码、反码、补码。
其中对有符号整数来说:这三种表示方法都分为符号位和数值位两部分。数值位的最高一位是符号位,用0表示'正',1表示'负'。
正数:原码、反码、补码均相等,三码合一。
负数:
原码:直接将数值转换为二进制,得到的就是原码
反码:原码的符号位不变,其他位按位取反
补码:反码+1
整数在内存中以补码的形式储存。
2、大小端字节序
补码在存储时存在大小端问题
2.1、什么是大小端?
超过一个字节的数据在内存中存储时,就有存储顺序的问题,按照不同的存储顺序,可分为大端字节序存储和小端字节序存储。
大端模式:数据的低位字节的内容保存在内存的高地址处,而数据的高位字节内容,保存在内存的低地址处。
小端模式:数据的低位字节的内容保存在内存的低地址处,而数据的高位字节内容,保存在内存的高地址处。
2.2、什么是 "高/低位字节" 和"高/低地址 " 呢?
高/低位字节:
举一个十进制数的例子: 135 中数字自右向左依次为 个位、十位、百位, 其中 5 为个位数,称为低位;1 为百位数,称为高位。即数字自右向左,位数增高。
高/低地址:
在内存中,自左向右 地址逐渐增高。
注意:1、整数在内存中以补码的形式进行储存。
2、在调试窗口中观察内存时,为观察方便,显示的是16进制
请看一下例子:
在不同的编译环境下,大小端存储模式不同。
大小端存储只是机器在存储时有区分,在取出存储的数据时,取出的数据是相同的,还是那个数据。
练习1:写一段代码,来判断当前机器的字节序。
判断思路:
在强制类型转换为char时,取出一个字节的数,会将低地址的数据取出。
我们只需要将一个数的一个字节取出进行判断。
#include <stdio.h>
int check_sys()
{
int a = 1;
return (*(char*)&a);
}
int main()
{
int ret = check_sys();
if (ret == 1)
{
printf("小端\n");
}
else
printf("大端\n");
return 0;
}
练习2:根据代码,得出其打印的值
前提:该环境为小端存放。
ptr1[-1] == *(ptr1 - 1)
最后的打印结果为 4 2000000
3、浮点数在内存中的存储
浮点数与整型在内存中的存储方式不同。
根据国际标准,任意一个二进制浮点数V可以表示成下面的形式:
V = (-1)^s * M * 2^E
(-1)^s 表示符号位,当s=0,V为正数; 当s = 1, v为负数
M 表示有效数字, M是大于等于1,小于等于2
2^E 表示指数位
十进制 0.5 写成二进制为 0.1,转换为二进制的科学计数法为 1.0*2^-1
十进制 5.0 写成二进制为 101.0,转换为二进制的科学计数法为 1.01*2^2