ICode9

精准搜索请尝试: 精确搜索
首页 > 系统相关> 文章详细

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

2021-05-23 20:52:34  阅读:156  来源: 互联网

标签:储存 反码 int 补码 数据类型 char 内存 printf


本章重点
  • 数据类型的详细介绍 (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;
}



标签:储存,反码,int,补码,数据类型,char,内存,printf
来源: https://blog.51cto.com/u_15157811/2805036

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有