整数和浮点数在内存中存储

前言

一.整数在内存中存储
二.大小端字节序
三.浮点数在内存中的存储

一、整数在内存中存储

1.整数的二进制表示有原反补码三种表示方法,有符号的整数最高位为符号位,0表示正数,1表示负数。
2.正数的原反补码相同,负数的原反补码关系如下
在这里插入图片描述
3.数据在内存中的存储的就是补码

二、大小端字节序

在这里插入图片描述
如上图在vs中a的赋值与a在内存中的存储恰恰相反,为什么呢,这就是跟大小端字节序有关了

1.什么是大小端

首先,只有大小超过一个字节的才有大小端问题
小端存储:低位数值(44)的存储在低地址处(也就是前面),所以观看时是反的
大端存储:存储是正着的
怎么存的就怎么取出来

2.1练习。

设计⼀个⼩程序来判断当前机器的字节序

#include <stdio.h>
int check_sys()
{
 int i = 1;
 return (*(char *)&i);
}
int main()
{
 int ret = check_sys();
 if(ret == 1)
 {
 printf("⼩端\n");
 }
 else
 {
 printf("⼤端\n");
 }
 return 0; }

小端时,i的补码为0x00000001,但是在内存中的存储为01 00 00 00,所以转换为char类型时访问的一个字节为01

2.2

#include <stdio.h>
int main()
{
 char a[1000];
 int i;
 for(i=0; i<1000; i++)
 {
 a[i] = -1-i;
 }
 printf("%d",strlen(a));
 return 0; 
 }

易得,strlen遇到’\0’也就是int值为0时就会停止计数,只会记录’\0’之前的字符
在这里插入图片描述
易得,char类型的取值范围是-128~127,所以char类型的值的±是按照这个圆来转动的
比如127能够存储在char中,并且若按照%d来打印也会打印出127,但128,超出了char的范围,所以肯定是存不下的,128的原码为 0000 0000 1000 0000补码为0111 1111 1000 0000,然后截断最后8个二进制赋给char为1000 0000这就是-128,同理129赋给char为-127,-129赋给char则为127,但是打印%d的形式就不一定为-129了,因为会发生整型提升,不然怎么可能char与int的值一一对应嘛,所以数组的值为-1 -2 -3 -4 …-128 -129…-255…,-129就是127,-255就是1,所以’\0’之前有255个非零字符,所以打印出255
加粗样式

三.浮点数在内存中存储

1.浮点数二进制的表示

在这里插入图片描述
如上图,5.5的二进制的表示,小数前101,小数点后权重依次为2(-1),2(-2),2(-3)……所以为1,所以5.5的二进制为101.1,转换为科学计数法为(-1)01.011*22,其中0用S表示,1.011用M(必须要大于1),2用E,所以所有的小数都可以通用SME表示了,但是像5.4这种,并不能精确表示,只能无限接近

2.浮点数的存储

在这里插入图片描述
float类型为四个字节,所以共32个比特位,第一位存S,后面8位存E,最后32个存M,所以浮点数也是有大小范围的,其中M只表示1.011小数点后面的就可以了即011,还有因为E可以为负数,但存储的E是无符号的,比如0.5,E为-1,所以存储时要加上127即存储的是129(1000 0001)所以5.5的存储为0 1000 0001 01100000000000000000000转换为16进制为40A00000,小端存储为0000A040
在这里插入图片描述
注意double为8个字节,所以更大,E存时加上1023(中间数)

3.浮点数的取出

3.1E不全为0或1
怎么放进去的就怎么取出来

3.2E全为0
E就实际为(1-127),而M也还原为0.XXXXXX不要以前小数点前的1了(这是规定),所以这个值就近似为0,打出来也是0

3.3E全为1
表示无穷大

练习

#include <stdio.h>
int main()
{
 int n = 9;
 float *pFloat = (float *)&n;
 printf("n的值为:%d\n",n);
 printf("*pFloat的值为:%f\n",*pFloat);
 *pFloat = 9.0;
 printf("num的值为:%d\n",n);
 printf("*pFloat的值为:%f\n",*pFloat);
 return 0; }

在这里插入图片描述
在这里插入图片描述

  • 22
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值