Java教程

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

本文主要是介绍不同数据类型在内存中的储存,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
本章重点
  • 数据类型的详细介绍 (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;
}


这篇关于不同数据类型在内存中的储存的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!