首页 > 其他 > 详细

不同数据类型在内存中的储存

时间:2021-05-23 23:35:02      阅读:33      评论:0      收藏:0      [点我收藏+]
本章重点
  • 数据类型的详细介绍 (1.内置类型 2.自定义类型(构造类型))

  • 整形在内存中的存储:原码、补码、反码

  • 大小端字节序介绍及判断

  • 浮点型在内存中的存储解析

    结尾附有练习题


1->

整形家族:
char
	unsigned?char?0-255??//无符号字符
	signed?char?-128-127?//有符号字符
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?表示空类型(无类型)
通常应用于函数的返回类型、函数的参数、指针类型


2->整形在内存中的存储:原码、补码、反码

????

在计算机中(对于整形来说:数据存放在内存中其实存放的是补码)

(1).有符号数(整形)有三种表示方法,即原码、反码、补码,其中正数原反补相同。

(2).无符号数也是有三种表示 原、反、补,只不过原反补都相同。

(3).三种表示方法均有符号位和数值位两部分,符号位都是用0表示表示"正",用1表示"负",而数值位三种表示方法各不相同

总结就是

整数:

1.有符号数

正数:原码、反码、补码 相同

负数:原码、反码、补码 不同,要进行计算

2.无符号数:

原码、反码、补码相同

举例

//原码
//	直接将二进制按照正负数的形式翻译成二进制就可以
//	列如:
//		int?a?=?20;//4个字节-32bit?,正数原反补相同
//		00000000000000000000000000010100?-?原码
//		00000000000000000000000000010100?-?反码
//		00000000000000000000000000010100?-?补码
//		0x00000014?-?16进制形式
//
//反码
//	将原码的符号位不变,其他位依次按位取反就可以得到了
//	列如:
//		int?b?=?-10;
//		10000000000000000000000000001010?-?原码
//		11111111111111111111111111110101?-?反码
//
//补码
//	将反码+1得到补码
//	例如
//		int?b?=?-10;
//		11111111111111111111111111110101?-?反码
//		11111111111111111111111111110110?-?补码
//		0xFFFFFFF6

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


3->大小端字节序介绍及判断

什么是大端小端(在内存中左到右是低地址到高地址):

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

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

//	int?a?=?20;
//	//0x?00?00?00?14
//??????//在内存中
//	//小端
//	//14?00?00?00
//	//大端
//	//00?00?00?14


判断当前字节序是什么

int?main()
{
	int?a?=?1;
	char*?p?=?(char*)&a;?
	//判断内存中第一个字节的值是否为1
	if?(*p?==?1)
	{
		printf("小端\n");
	}
	else?
	{
		printf("大端\n");
	}
	return?0;
}
//结果为:小端

封装成函数
int?check_sys()
{
	int?a?=?1;
	char*?p?=?(char*)&a;
	//返回1,小端
	//返回0,大端
	return?*p;
}

int?main()
{
	int?ret?=?check_sys();
	if?(ret?==?1)
	{
		printf("小端\n");
	}
	else?
	{
		printf("大端\n");
	}
	return?0;
}


4->浮点型在内存中的存储

9.0
1001.0?//二进制
//浮点型在内存中的存储方式
(-1)^0?*?1.001?*?2^3
(-1)^S?*???M???*?2^E
E=0?,??M=1.001,???E=3


举例说明

int?main()
{
	float?f?=?5.5;
	//5.5
	//101.1
	//(-1)^0?*?1.011?*?2^2
	//S?=?0??M?=1.011??E=2
	//?S?127+E?8bit????M?23bit
	//转化为二进制
	//?0?10000001?01100000000000000000000
	//0100?0000?1011?0000?0000?0000?0000?0000
	//0x40b00000?
	return?0;
}

实例

int?main()
{
	int?n?=?9;
	//0?00000000?00000000000000000001001?-?补
	//
	float*?pfloat?=?(float?*)&n;
	printf("n的值为:?%d\n",?n);?//9
	printf("*pfloat的值为:?%f\n",?*pfloat);?//0.000000
	//(-1)^0?*?00000000000000000001001?*?2^-126

	*pfloat?=?9.0;
	//1001.0
	//1.001*2^3
	//(-1)^0?*?1.001?*?2^3
	//0?10000010?00100000000000000000000
	printf("num的值为:?%d\n",?n);?//1091567616
	printf("*pfloat?%f\n",?*pfloat);?//9.000000
	return?0;
}

练习题

#include?<stdio.h>

输出什么
int?main()
{
	char??a?=?-1;
	//10000000000000000000000000000001
	//11111111111111111111111111111110
????????//11111111111111111111111111111111
	//11111111?-?取一个字节
	//输出的是%d
	//11111111111111111111111111111111?-?补
	//11111111111111111111111111111110?-?反码
	//10000000000000000000000000000001?-?原
	signed?char?b?=?-1;
	//11111111
	unsigned?char?c?=?-1;?//原反补相同
	//11111111
	//00000000000000000000000011111111?=?255
	printf("a=%d,b=%d,c=%d",?a,?b,?c);

	return?0;
}

int?main()
{
	char?a?=?-128;
	//10000000000000000000000010000000
	//11111111111111111111111101111111
	//11111111111111111111111110000000?-补
	//10000000
	//11111111111111111111111110000000?-补原相同
	printf("%u\n",?a);
	//%u?-?打印十进制的无符号数字
	//%d?-?打印十进制的有符号数字
	return?0;
}


int?main()
{
	int?i?=?-20;
	unsigned?int?j?=?10;
	printf("%d\n",?i?+?j);
}

#include?<Windows.h>
int?main()
{
	unsigned?int?i;
	for?(i?=?9;?i?>=?0;?i--)//i是无符号数?所以死循环
	{
		printf("%u\n",?i);?
		Sleep(100);?//间隔100毫秒
	}
	return?0;
}


int?main()
{
	char?a[1000];
	int?i;
	for?(i?=?0;?i?<?1000;?i++)
	{
		a[i]?=?-1?-?i;
	}
	printf("%d",?strlen(a));?//-1到-128?再减1?变为127-1?再到0停止?
	return?0;
}

unsigned?char?i?=?0;?//0-255
int?main()
{
	for?(i?=?0;?i?<=?255;?i++)
	{
		printf("hello?world\n");
	}
	return?0;
}


不同数据类型在内存中的储存

原文:https://blog.51cto.com/u_15157811/2805036

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!