资讯专栏INFORMATION COLUMN

数据在内存中的存储

BicycleWarrior / 1841人阅读

摘要:文章目录一数据类型二整型在内存中的存储原码反码补码大小端三例题练习一数据类型在语言中有整型浮点型构造类型指针类型等。正数的原反补码都相同对于整形来说数据在内存中存放的都是补码。

一、数据类型

在c语言中有整型、浮点型、构造类型、指针类型等。

类型的意义在于:

  1. 使用不同的类型决定了开辟空间的大小
  2. 决定了如何使用内存空间

二、整型在内存中的存储

知道了一个变量的类型,就知道可以开辟的空间的大小。
那例如int型具体是如何在内存中进行存储的呢?
需要了解下面的概念:

1.原码、反码、补码

计算机中的有符号数有三种表示方法,即原码、反码和补码。
三种表示方法均有符号位和数值位两部分,符号位都是用0表示“正”,用1表示“负”,而数值位
三种表示方法各不相同。

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

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

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

正数的原、反、补码都相同
对于整形来说:数据在内存中存放的都是补码。
原因在于,使用补码,可以将符号位和数值域统一处理;同时,加法和减法也可以统一处理。此外,补码与原码相互转换,其运算过程是相同的,不需要额外的硬件电路。


看看在内存中的存储:
按照推理,a的补码应该是0000 0014,b的补码应该是ffff fff6
而在内存中所存储的形式有点不一样,这可能就得了解大小端的概念了

2.大小端

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

从图中可以看出这台电脑是小端存储的,因为它数值的低权值位存储在低地址处。

三、例题练习

//输出什么?#include int main(){    char a= -1;    signed char b=-1;    unsigned char c=-1;    printf("a=%d,b=%d,c=%d/n",a,b,c);    return 0; }

结果:

解析:

首先-1是整型常量,在32位下的补码是1111 1111 1111 1111 1111 1111 1111 1111 ,在存入char型变量时发生截断,所以在内存中存入a b c的数据都是1111 1111,是一样的,这是因为数据的存入和目标变量没有关系,目标变量只提供存储空间。
printf也是函数,传参就要发生值拷贝,就需要用到CPU,也同样就会发生隐式转换。
ab都是有符号字符型,发生整型提升时补上对应的符号位,即1111 1111 1111 1111 1111 1111 1111 1111,还是-1的补码,按照%d的有符号整数进行打印时,就是-1。
c变量是无符号字符型,在进行整型提升时默认补0,也就是0000 0000 0000 0000 0000 0000 1111 1111,按照%d进行打印后是255

#include int main(){    char a = -128;    printf("%u/n",a);    return 0; }

结果:

分析:

#include int main(){    char a = 128;    printf("%u/n",a);    return 0; }

结果:
和上一题一样,因为128和-128发生截断后在a里存的数据是一样的

    int i = -20;    unsigned int j = 10;    printf("%d/n", i + j);

结果:

分析:

因为并没有对两个变量的数据进行修改,想加过后按照%d的结果就是两个数直接相加的结果

    unsigned int i;    for (i = 9;i >= 0;i--)    {        printf("%u/n", i);    }

结果:
死循环,从9->0->255->0->255,因为无符号数始终大等于0

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

结果:

分析:

#include unsigned char i = 0;int main(){    for(i = 0;i<=255;i++)   {        printf("hello world/n");   }    return 0; }

结果:
死循环,i 的值从0->255一直循环

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/121412.html

相关文章

  • Express.js 中的 Sessions 如何工作?(译)

    世界上任何一个拥有用户数据的 web 应用都必须处理 sessions。作为一名开发者,我们必须要知道它们是什么以及如何处理它们。在这篇文章中,我想要分享的是: session 是什么? session 如何存储数据? 你如何决定存放 session 数据的位置? 在 sessions 工作时,你必须意识到的安全性上的影响有哪些?在一些示例代码中,我将会运用 session npm modul...

    Hydrogen 评论0 收藏0
  • 【C语言进阶】☀️数据类型&amp;&amp;整型内存中的存储

    目录 ​  一、数据类型介绍 二、类型的意义 三、类型的基本归类 整型家族 浮点数家族 构造类型(自定义类型) 指针类型 空类型 四、整形在内存中的存储 原码、反码、补码 大小端字节序 为什么有大端和小端? 一道经典笔试题  一、数据类型介绍 数据从大的方向分为两类: 内置类型自定义类型内置类型我们前面已经学习过,如下: char            //字符数据类型 short      ...

    Xufc 评论0 收藏0
  • C语言进阶第一问:数据内存中是如何存储的?(手把手带你深度剖析数据内卒中的存储,超全解析,码住不

    摘要:在符号位中,表示正,表示负。我们知道对于整型来说,内存中存放的是该数的补码。在计算机系统中,数值一律用补码来表示和存储。表示有效数字,。规定对于位的浮点数,最高的位是 ...

    ghnor 评论0 收藏0
  • Mongo、Redis、Memcached对比及知识总结

    摘要:当重启时,将会读取文件进行重放以恢复到关闭前的最后时刻。伸缩性受到线程数的限制,线程数的调度对也是不小的负担。所以允许我们设置线程池的大小,对需要从文件中加载相应数据的读取请求进行并发操作,减少阻塞的时间。 存储原理(持久化) Mongo Mongo的数据将会保存在底层文件系统,因此存储容量远大于redis和memcached。一个database中所有的collections以及索...

    Vultr 评论0 收藏0

发表评论

0条评论

BicycleWarrior

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<