数据在内存中的存储(原反补码、大小端、浮点数)

本文探讨了整型和浮点型在内存中的存储方式,包括原码、反码、补码的概念以及无符号数和有符号数的区别。此外,还介绍了如何判断机器字节序(大小端模式)以及整型提升在不同数据类型转换中的应用。同时,讲解了浮点数在内存中的表示遵循IEEE 754标准,并展示了浮点数的二进制表示形式。
摘要由CSDN通过智能技术生成

目录

1. 整形在内存中的存储

下面看几道题(整型提升、无符号数相关)

2. 浮点型在内存中的存储


1. 整形在内存中的存储

原码、反码(符号位不变,其他位取反)、补码(反码+1)
注:原码 → 补码(符号位不变,其他位取反,再+1)
       补码 → 原码(符号位不变,其他位取反,再+1)

  1. 无符号整型:三码合一
  2. 有符号整型的正数:三码合一
  3. 有符号整型的负数:计算机中存储的是补码

内存中字节的顺序(小大端模式看不同的架构;):

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

设计一个代码来判断当前机器是大小端?

	int a = 1; // 0x 00 00 00 01(大端) 0x 01 00 00 00(小端)
	//来判断一下第一个字节是00还是01;
	//怎么获取第一个字节:通过char指针
	char* p =(char*)&a;//强制类型转换
	if(*p == 1)
		printf("小端排序\n");
	else
		printf("大端排序\n");

数据在内存中的存储或读取,也就是内存的使用,是低地址→高地址,还是高地址→低地址?

(先使用低地址,还是先使用高地址)

下面看几道题(整型提升、无符号数相关)

	char a= -1;//a补码:11111111111111111111111111111111
	//char a: 11111111,有符号时候,
	signed char b=-1;
	//char b: 11111111
	unsigned char c=-1;
	//char c: 11111111
	printf("a=%d,b=%d,c=%d",a,b,c);
	//因为是%d,整型提升:
	//有符号数:高位补符号位
	//char a: 11111111
	//提升后:11111111111111111111111111111111  转化为原码后得:-1
	//a,b一样
	//无符号位,高位补0
	//00000000000000000011111111 = 255
	//答案 -1 -1 255
	char a = -128;
	//100000000000000000000000010000000
	//111111111111111111111111110000000补码
	//char a:10000000
	printf("%u\n",a);//%u是指unsigned int格式
	printf("%d\n",a);
	//整型提升(根据char是否有符号):
	//11111111111111111111111110000000 补码:打印是u%格式,不用转换;
	//11111111111111111111111101111111
	//10000000000000000000000010000000 = -128 打印%d格式
	unsigned int i;
	for(i = 9; i >= 0; i--) 
	{
		printf("%u\n",i);
	}//循环9次后会进入循环
	//定义i为无符号数,所以没有负数,i=0减1之后是一个大的正数;参考圆来表示无符号数和有符号数
	// 0 1 2 ..... 127 -128 -127 .....-1 0 1 2 ..... 
	// 0 1 2 ..... 255 0 1 .....255...
	char a[1000];
	int i;
	for(i=0; i<1000; i++)
	{
		a[i] = -1-i;
	}//此时a中是-1,-2,-3......,-1000
	//但是char中只能存储-127到128的数;所以-128之后就是127 126 ... 1 0
	printf("%d",strlen(a));//strlrn找到'\0'也就是0为止;一共255个
	unsigned char i = 0;
	for(i = 0;i<=255;i++)
	{
		printf("hello world\n");
	}//此循环会进入死循环:因为unsigned char 范围是0-255, 255+1=0;
	int a  = 0x1234;//0x1234 = 0x 00 00 12 34
	//内存中实际上是:0x 34 12 00 00
	char b = *(char *)&a;
	//char* 类型解引用后只能访问一个字节,所以 b = 0x34;
	printf("%d\n", b);//以%d打印b时,整型提升, 0x34 = 52

2. 浮点型在内存中的存储

float f = 5.5;
二进制101.1 = 1.011*2^2
则符号位为0,指数为129(2+127,余码系统,通过偏移量127将指数都转换为正数),尾数为011,整数位的1不用存储
0(1位) 10000001(8位) 01100000000000000000000(23位)
0x 40 b0 00 00(内存展示的是16进制)
 

根据国际标准 IEEE (电气和电子工程协会) 754 ,任意一个二进制浮点数 V 可以表示成下面的形式:
(-1)^S * M * 2^E
(-1)^s 表示符号位,当 s=0 V 为正数;当 s=1 V 为负数。
M 表示有效数字,大于等于 1 ,小于 2
2^E 表示指数位。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值