本节主要有以下内容:
一、整形在内存中的存储
二、浮点数在内存中的存储
三、大小端
一、整形在内存中的存储(通过补码形式存储)
类型的意义:变量使用何种类型,决定了它所开辟的内存空间大小。
整形在内存中的存储是通过补码的形式存储的。这里介绍三个名词:原码、反码、补码。
【1】原码:是最简单的机器数表示法。用最高位表示符号位,‘1’表示负号,‘0’表示正号。其他位存放该数的二进制的绝对值。
【2】反码:正数的反码还是等于原码,负数的反码就是他的原码除符号位外,按位取反。
【3】补码:正数的补码等于他的原码,负数的补码等于反码+1。
Tips:正数的原码、反码、补码都是一个数。
采用补码存储原因:使用补码,可以将符号位和数值域统一处理; 同时,加法和减法也可以统一处理(CPU只有加法器)此外,补码与原码相互转换,其运算过程是相同的,不需要额外的硬件电路。
#include <stdio.h>
int main()
{
int a=10;
int b=-10;
return 0;
}
10在32位系统下的二进制数为:0000 0000 0000 0000 0000 0000 0000 1010
转换为16进制为: 0 0 0 0 0 0 0 a
可见内存中显示的与我们所书写的方式有一些差异,这是由于此机器采用小端字节序存储数据,本节最后介绍大小端。
根据补码的概念可知,-10在32位系统下的二进制数为:1111 1111 1111 1111 1111 1111 1111 0110
转换为16进制为: f f f f f f f 6
可见,在不要求大小端字节序时,我们所书写的与内存所显示的一样,由此可见,整型确实是采用补码的方式在内存中进行存储的。
二、浮点数在内存中的存储(TODO)
1.单精度在内存中的存储
三、大小端
【1】大端(Big-endian)存储模式:低地址存高位,高地址存低位
【2】小端(Little-endian)存储模式:低地址存低位,高地址存高位
举例:测试一台机器的字节序。
#include <stdio.h> int check_sys() { int i=1; char* p=(char*)&i; return *p; } int main() { int ret=check_sys(); if(ret==1) { printf("小端字节序\n"); } else { printf("大端字节序\n"); } return 0; }