数据在内存中的存储

本文详细介绍了数据在内存中的存储方式,包括整形家族的补码、反码、原码表示,以及大小端模式的区别。讨论了有符号数和无符号数在内存中的符号位填充规则,并通过实例解释了整数运算过程。同时,概述了浮点数在内存中的存储模型,强调了指数位的处理方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.整形家族:

char
   unsigned char
   signed char
short
   unsigned short(int)
   signed short(int)
int
   unsigned int
   signed int
long
   unsigned long(int)
   signed long(int) 

2.浮点数家族:

float

double

3.构造类型:

——数组类型

——结构体类型 struct

——枚举类型 enum

——联合类型 union

4.指针类型

5.空类型: void

一、整形在内存中的储存

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

原码:直接将二进制按照正负数的形式翻译成二进制就可以。

反码:将原码的符号位不变,其他位依次按位取反就可以得到了。

补码:反码+1就得到补码。

(正数的源、反、补码都相同。)

大小端介绍:

大端模式——数据的低位保存在内存的高地址中。

小端模式——数据的低位保存在内存的低地址中。

符号位填充:

无符号数,填0

有符号数,填符号位

比特位填充时,看变量自身的类型。

#include <stdio.h>
int main()
{
 char a = -1;
signed char b = -1;
unsigned char c = -1; printf("a=%d,b=%d,c=%d",a,b,c); //-1 -1 255 return 0;}

上述代码中,a,b为有符号数,输出为-1

c为无符号数,而-1在内存中的存储方式为1111 1111,换算为无符号数就是255;

#include <stdio.h>
int main()
{
 char a = -128;
 printf("%u\n",a);  //256
return 0;}

上述代码中,-128在内存中储存方式为补码。

原码:   1000 0000

反码:   1111 1111

补码:1 0000 0000

(%u  无符号10进制整数)

#include <stdio.h>
int main()
{
 int a = -20;
 unsigned int b = 10;
 printf("%d\n",a+b);  //
 return 0;
}

上述代码中,a有符号整数:

原码:0000 0000 0000 0000 0000 0000 0001 0100

反码:1111 1111 1111 1111 1111 1111 1110 1011

补码:1111 1111 1111 1111 1111 1111 1110 1100

b为无符号整数:

补码:0000 0000 0000 0000 0000 0000 0000 1010

a+b得:

          1111 1111 1111 1111 1111 1111 1111 0110

转换为十进制

二、浮点数在内存中的存储

因为任意浮点数都可以用科学记数法来表示

则任意浮点数V都可以表示为如方式:


S=0,V为正数,S=1,V为负数

M表示有效数字,大于等于1,小于2

E表示指数位



以上为32位的浮点数存储模型

所以对于浮点数的存储,就是对于S M E的存储;

至于指数E:

首先,E为一个无符号整数

因为科学记数法中的E可以为负数,所以IEEE 754规定,E的真实值需加上一个中间数;

对于8位的E,中间数为127

对于11位的E,中间数为1023

当E全为零,表示一个无限接近0的数字

当E全为1,表示一个无穷大(小)的数字


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值