C语言数据在内存中的存储

整数在内存中的存储

整数在内存中使用反码进行存储。正数的原码反码补码相同。负数的反码是符号位不变,其他位对原码按位取反后,再加上1.

使用反码存储,是因为计算机可以把符号位和数值位进行统一处理,加法和减法也可以统一处理,补码和原码之间的换算也是相同的,不需要额外的硬件电路,非常方便。

大小端字节序

超过一个字节的数据在内存中存储就有存储顺序的问题。

大端(存储)模式:数据的低位字节内容保存在高位的地址,数据的高位字节内容保存在低位的地址。

小端(存储)模式:数据的低位字节内容保存在低位的地址,数据的高位字节内容保存在高位的地址。

举个栗子,一个整数,原码是  0x11223344,按照16进制进行存储。11所在的字节就是高位字节,44所在的字节就是低位字节。

在内存中一个整型要占用四个字节。它可能是 11 22 33 44的顺序存储,地址从左到右,由低到高,11是高位,却存在低位地址,所以说明该模式是大端存储。 也可能是 44 33 22 11的顺序存储,地址从左到右,由低到高,44是低位,存在低位地址,说明该模式是小端存储。

可以写个代码测试一下内存的存储模式。

int main()
{
  int a = 1.
  char *p = (char*)&a;

  if(*p = 1)
  { 
    printf("小端\n");
  }
  else
  {
    printf("大端\n");
  }

  return 0;
 }

把取出的整型地址强制转换成char*的地址后,留下的就是低地址的一个字节。如果留下的是00,这显然是高位的数,低地址存高位内容,就是大端。留下的是01,也就是1,这是低位的数,存在低地址,所以是小端。

char型数据,只能存(-128 - 127)的数,因为只能存1个字节,就是8个比特位的数,就算把数塞满,最多也就是127,如果符号位是1的话,那就是负数。如果是无符号的char----unsigned char,可以存(0 - 255)的数。

浮点数的存储

根据国际标准IEEE754,任意一个二进制数V = (-1)^s  *M*2^E.  这里的(-1)^s表示 -1的s次方,2^E表示2的E次方。

(-1)的s次方表示符号位。s是0就是整数,是1就是负数。

M是大于等于1小于2的有效数字。

2的E次方是指数位。

对于32位的浮点数,最高的1位存S,后面的8位存E,再后面的23位存M

对于64位的浮点数,最高的1位存S,后面的11位存E,再后面的52位存M

先把浮点数写成二进制数,然后按照二进制数浮点数存储的方式计算就知道浮点数在内存中如何存放了。

计算机保存M时,比如M=1.01,只保存后面的01,等到读取时再把前面的1加上去。这样就能多保存一位数字更精确了。

E全为0时代表这个数是接近于0的很小的数,E全为1时代表这个数是接近于无穷大的很大的数字。

E不全为0或者1时,取出时要-127,才能得到真实值。

  • 15
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C语言,局部变量和函数参数等数据通常存储在栈空间。栈空间是一种自动管理的内存区域,用于存储函数的局部变量和函数调用的相关信息。 当一个函数被调用时,它的局部变量和函数参数被分配到栈空间。栈空间的分配和释放是由编译器自动完成的,遵循"后进先出"(Last-In-First-Out, LIFO)的原则。 在栈空间,局部变量的存储是通过栈指针(SP)进行的。栈指针指向当前栈顶的位置,新的局部变量被分配在栈顶,并且栈指针向下移动。当函数调用结束后,栈指针会回退到之前的位置,之前的局部变量所占用的空间就可以被重新使用。 要存储和读取栈空间数据,可以直接使用变量名来进行操作。例如,以下是一个示例函数,展示了如何存储和读取栈空间数据: ```c void exampleFunction() { int x = 10; // 在栈空间分配一个整型变量x int y = 20; // 在栈空间分配一个整型变量y int z = x + y; // 通过操作栈空间的x和y计算z的值 printf("z = %d\n", z); // 输出z的值 } ``` 在这个示例函数,变量`x`和`y`被分配到栈空间,它们可以通过变量名直接进行操作和计算。最后,通过`printf`函数将计算得到的结果输出。 需要注意的是,栈空间数据只在函数执行期间有效。当函数执行结束后,栈空间数据将被销毁,并且不能再访问这些数据。因此,栈空间主要用于存储函数调用期间所需的临时数据和局部变量。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值