数据在内存中的存储(整型与浮点数类型)

本文详细介绍了数据类型如整型、浮点型的基础概念,探讨了它们在内存中的存储方式,包括原码、反码和补码的区别,以及大小端模式。还通过示例解析了整数和浮点数在不同操作下的转换和内存表示。
摘要由CSDN通过智能技术生成

目录

数据类型详细介绍

数据类型介绍

数据类型的基本归类

整型在内存中的存储

原码、反码、补码

​编辑

大小端介绍

例题

浮点型在内存中的存储

常见的浮点数

浮点数存储的例子(具体解析浮点数存储)

解析最初的例题


数据类型详细介绍

 数据类型介绍

char         //字符数据类型
short        //短整型
int          //整型
long         //长整型
long long    //更长的整型  
float        //单精度浮点数
double       //双精度浮点数

类型的意义:

1.使用这个类型开辟内存空间的大小(大小决定了使用范围)

2.如何看待内存空间的视角

数据类型的基本归类

整型家族:

char               //底层存储的是ASCII码值,也是个整数
    unsigned char
    signed char
short
    unsigned short[int]
    signed short[int]
int 
    unsigned int
    signed int
long
    unsigned long[int]
    signed long[int]

浮点数家族:

float
double

构造类型:

数组类型
结构体类型 struct
枚举类型   enum
联合类型   union

指针类型:

int* pi;
char* pc;
float* pf;
void* pv;

空类型:

void 表示空类型(无类型)

通常应用于函数的返回类型、函数的参数、指针类型


整型在内存中的存储

原码、反码、补码

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

三种表示方法均有符号位和数值位两部分,符号位都是用0表示“正”,用1表示“负”,而数值位三种表示方法各不相同。

原码:

直接将符号数按照正负数的形式翻译成二进制就可以

反码:

将原码的符号位不变,其他位依次按位取反就可以得到了。

补码:

反码+1就得到补码

正数的原码、反码、补码都相同

对于整型来说:数据存放内存中其实存放的是补码

 下图为-10在内存中的补码表示(16进制、小端存储):

大小端介绍

什么是大端小端:

大端(存储)模式,是指数据的低位保存在内存的高地址中,而数据的高位,保存在内存的低地址中

小端(存储)模式,是指数据的低位保存在内存的低地址中,而数据的高位,保存在内存的高地址中

大小端存在的原因:

 如何判断当前机器的字节序(大小端):

//判断当前机器的字节序
int main() {
	int a = 1;//小端为01 00 00 00,大端为00 00 00 01
	char* p = (char *)&a;//&a为int*型,需要强制类型转换,char类型指针正好访问第一个字节
	if (*p == 1) {
		printf("小端");
	}
	else
	{
		printf("大端");
	}
	return 0;
}

例题

//输出什么?
int main() {
	char a = -1;
	//原码:10000000000000000000000000000001
	//反码:11111111111111111111111111111110
	//补码:11111111111111111111111111111111
	//11111111(char只存一个字节,后八位)
	//发生整型提升:11111111111111111111111111111111=-1

	signed char b = -1;
	//11111111(char只存一个字节,后八位)
	//发生整型提升:11111111111111111111111111111111=-1
	unsigned char c = -1;
	//11111111(char只存一个字节,后八位)
	//发生整型提升:00000000000000000000000011111111=255(无符号高位补0)
	//正数原码补码相同
	printf("a=%d,b=%d,c=%d", a, b, c);//-1 -1 255

	return 0;
}
int main() {
	char a = -128;
	//10000000000000000000000010000000(原)
	//11111111111111111111111101111111(反)
	//11111111111111111111111110000000(补)
	//char-10000000
	//整型提升11111111111111111111111110000000
	printf("%u\n", a);//%u无符号十进制数字(原补码相同)
	//11111111111111111111111110000000=4,294,967,168

	return 0;
}
int main() {
	char a = 128;//超出范围,发生截断
	//00000000000000000000000010000000(原)
	//char-10000000=-128
	//整型提升11111111111111111111111110000000
	printf("%u\n", a);//%u无符号十进制数字
	//11111111111111111111111110000000=4,294,967,168

	return 0;
}
int main() {
	int i = -20;
	//10000000000000000000000000010100
	//11111111111111111111111111101011
	//11111111111111111111111111101100
	unsigned int j = 10;
	//00000000000000000000000000001010
	printf("%d\n", i + j);
	//11111111111111111111111111110110(补码)
	//11111111111111111111111111110101(反码)
	//10000000000000000000000000001010(原码)=-10

	return 0;
}
int main() {
	unsigned int i;
	for (i = 9; i >=0; i--) {
		printf("%u\n", i);
	}//死循环,因为判断条件有=0,而无符号整型永远不会<0


	return 0;
}
int main() {
	char a[1000];//char类型取值范围(-128~127)/(10000000~01111111)
	int i;
	for (i = 0; i < 1000; i++) {
		a[i] = -1 - i;
	}//-1 -2 -3 ...-127 -128 127 126...3 2 1 0 -1 -2 ...
	printf("%d", strlen(a));//访问到0即\0,会停止访问,所以输出128+127=255


	return 0;
}
unsigned char i = 0;//unsigned char取值范围(0~255)(00000000~11111111)
int main() {
	for (i = 0; i <= 255; i++) {//永远小于等于255,陷入死循环
		printf("hello world\n");
	}
	return 0; 
}

浮点型在内存中的存储

常见的浮点数

3.14159  1E10浮点数家族包括:float、double、long double类型。浮点数表示的范围:float.h中定义

浮点数存储的例子(具体解析浮点数存储)

//浮点数和整数在内存中的存储有区别
int main() {
	//整数的形式存储,浮点数的形式读取
	int n = 9;
	float* pFloat = (float*)&n;
	printf("n的值为:%d\n", n);//9
	printf("pFloat的值为:%f\n", *pFloat);//0.000000

	//浮点数的形式存储,整数的形式读取
	*pFloat = 9.0;
	printf("n的值为:%d\n", n);//1091567616
	printf("pFloat的值为:%f\n", *pFloat);//9.000000

	return 0;                                                             

}

原因(此题下方有具体解析):

 

 

 

  例:

int main() {
	float f = 5.5f;
	//101.1
	//1.011 * 2^2
	//s=0 M=011 E=2
	//s=0 M=011 E=2+127
	//
	//0100 0000 1011 0000 0000 0000 0000 0000
	//40 b0 00 00
	return 0;


}

然后,指数E从内存中取出还可以再分成三种情况:

 

 

解析最初的例题

int main() {
	
	int n = 9;
	//00000000000000000000000000001001
	float* pFloat = (float*)&n;
	printf("n的值为:%d\n", n);//9
	printf("pFloat的值为:%f\n", *pFloat);//0.000000
	//00000000000000000000000000001001(内存认为是浮点数存储形式)
	//0(s)    00000000(E)     00000000000000000001001(M)
	//E为全0    +0.00000000000000000001001*2^(-126)
	//只打印小数点后6位
	*pFloat = 9.0;
	//1001.0
	//1.001*2^3   E=3
	//0(s)   10000010(E)      00100000000000000000000(M)
	printf("n的值为:%d\n", n);//1091567616
	//01000001000100000000000000000000(内存认为是整数数存储形式)
	//01000001000100000000000000000000=1,091,567,616(正数补码与原码相同)
	printf("pFloat的值为:%f\n", *pFloat);//9.000000
	

	return 0;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值