数据的存储

200 阅读2分钟

整形和浮点型

整形

###有符号数(正数和负数)=>

计算机中的整形有符号数有三种表示方法,即原码、反码和补码。

三种表示方法均有符号位和数值位,符号位 0=>正 1=>负

原码>>>>将十进制按二进制形式翻译成正负的二进制。

反码>>>>将原码的符号位不变,其它位按位取反。

补码>>>>反码+1=补码。

正数的原码、反码和补码是相同的,负数需要计算

image.png 计算机系统中,数值全部都是补码来表示和存储。原因使用补码可以将符号位和数值域做统一的处理,同时加减法也可以做统一处理(CUP只有加法器)。

###无符号数

无符号数的原码、反码和补码全部相同。

####大端小端

大端(存储)模式是指数据的低位保存在内存的高地址中,数据的高位保存在内存的高地址中。(11 22 33 44)
小端(存储)模式是指数据的高位保存到内存的低地址中,数据的低位保存在内存的高地址中。(44 33 22 11)

image.png eg:百度笔试题(请简述大端字节和小端字节的概念,设计一个小程序来判断当前机器的字节序) #include<stdio.h>

int main()

{

//返回 1 小端

//返回 0 大端

int a = 1;            //00000000 00000000 00000000 00000001(二进制)
                     //00 00 00 01(十六进制)小端存储
                     //01 00 00 00 (十六进制)大端存储
char* p = (char*)&a;//(char*)=>将int型强制转化为char型拿到一个字节的内容
if (*p == 1)
	printf("小端");
else
	printf("大端");
return 0;

}

image.png

也可以用函数将其封装。 eg:

int chek_sys()

{

int a = 1;
char* p = (char*)&a;
return *p;
    //2.int a = 1;
//char* p = (char*)&a;
//if (*p == 1)
	//return 1;
//3.int a = 1;
//return *(char*)&a;

}

#include<stdio.h>

int main()

{

int ret = chek_sys();
if (ret == 1)
{
	printf("小端");
}
else
{
	printf("大端");
}
return 0;

}

浮点型

浮点型的存储

浮点型的存储和整形有较大的差别,看下面的代码 #include<stdio.h>

int main()

{

int a = 9;
float* p = (float*)&a;
printf("%d\n",a);
printf("%f\n", p);
     float n = 9.0;
   int* b = (int*)&n;
printf("%f\n",n);
printf("%d\n", b);
return 0;

}

image.png 为什么会这样呢;浮点型的存储和拿取是和整形不同的下面详细看一下

image.png (-1)^SM2^E (将十进制转化为二进制)

(-1)^S=>表示浮点数的正负 (S为0 或1)

1<=M<2(1.xxxxxxx xxxxx表示小数位,在内存中M的首位默认为1,所以只保存小数位)

image.png

E为一个无符号整数 如果E为8位 0-255 中间数127 E为11位0-2047中-1023(E全为0是表示一个非常接近0的数,E全为1是表示一个非常大的数+-无穷大)

科学计数法中E可以为负数所以(IEEE754)规定存入内存的真实值必须加上一个真实值。

例如:2^10的E为10,所以保存为32位的浮点数是必须保存为10+127(=>10001001)。