当前位置:   article > 正文

C语言——数据在内存中的存储(上)_c语言数组内存存放

c语言数组内存存放

目录

一.数据类型的详细介绍 

二.大小端字节介绍及判断


一.数据类型的详细介绍 

我们都知道内置的数据类型有:c4a8e6aa8d8f46ea9955b95badc86fc3.png

 不知道大家是否好奇它们本身类型的意义是什么呢???

我将从下面2个方面来讲解:

1.使用这个类型开辟内存空间的大小(大小决定了使用范围)

2.如何看待内存空间的视角

  •  类型的基本归类
  • 整型家族:
  • 4b29ead41b2a4d2cae170fe7f266feec.png
  •  浮点数家族:
  • 3187bc7e737b4429bb8b79835994b052.png
  •  构造类型:

658bbc68106548b2b45dbe5d557429fd.png

 而数组类型:除去变量名就是数组类型

比如:

int arr[10]        类型:int [10]

int arr[5]               类型:int [5]       

char arr[10]        类型:char [10]

这三个就是不同的类型

  • 指针类型:
  • dcc0f225d4664eda96aa6acc068804ae.png
  •  空类型:
  • edd02d9848db4e2c9a1d4ef7bca45e4d.png

 

 我们知道创建变量是需要向内存开辟空间的。空间的大小是根据类型的不同而不同

70a20ede86644d14b5a6851fa4ea0923.png

 比如,我们创建了int 类型的a和b,我们都知道int类型要分配4个字节的空间,那在计算机中是如何存储的呢??我们往下看!!

在这之前我们需要了解一些原码 反码 补码的一点知识

c6e8089a24f34b46b64c3145d979c81f.png

而补码就是在反码上+1 

我们为什么要讲这个呢???因为数据存放内存中其实存放的就是补码!!

自然我们也会有疑惑,为什么呢??

cfdbdd76736640c2961322ee102ddb29.png

 4a045c3e15074be2a76e8daf1745f3f7.png

821cbec79ff945d9a72ad0d3befa90a8.png

 我们通过调试窗口看a和b变量在内存中的存储

这时,我们就看见了在内存中a和b变量在内存中的存储是以补码的形式,但我们也有新的疑惑,是不是顺序有点问题呢???

二.大小端字节介绍及判断

这时,我们要讲到大小端,那什么是大小端呢??

大端:是指数据的低位保存在内存的高地址中,而数据的高位,保存在内存的低地址中

小端:是指数据的高位保存在内存的高地址中,而数据的低位,保存在内存的低地址中

为什么要有大端和小端呢??

a3a1e4694793462e8a157fc792e9b50b.png

 我们来验证一下在VS中是小端存储还是大端存储呢??

  1. int cheak_sys()
  2. {
  3. int i = 1;
  4. return (*(char*)&i);
  5. }
  6. int main()
  7. {
  8. int ret = cheak_sys();
  9. if (ret == 1)
  10. {
  11. printf("小端\n");
  12. }
  13. else
  14. {
  15. printf("大端\n");
  16. }
  17. return 0;
  18. }

e315d8aa76054f0cb4a4381f2e445a0d.png

 通过验证我们发现在VS中,是以小端的形式存储的,这时我们也就能理解a和b顺序为什么是倒着存储的了

e3ed821dcb104e5aac94fcdcc297420e.png

  • 我们来练习一下:
  •  
    1. int main()
    2. {
    3. char a = -1;
    4. signed char b = -1;
    5. unsigned char c = -1;
    6. printf("a=%d b=%d c=%d", a, b, c);
    7. return 0;
    8. }

    结果是多少呢???

  • 6ef6a00e18ed48eeba6f54ed6444c9c9.png

     为什么呢???

    b5bd372e6230429790d0a18fa7fe768f.png

     所以unsigned char a结果就是255

    我们来看下列代码:

    1. int main()
    2. {
    3. char a = -128;
    4. //10000000 00000000 00000000 10000000 -原码
    5. //11111111 11111111 11111111 01111111 -反码
    6. //11111111 11111111 11111111 10000000 -补码
    7. //发生截断 10000000
    8. //整型提升后 11111111 11111111 11111111 10000000
    9. printf("%u\n", a);
    10. return 0;
    11. }

    9c2f460a201b4c01ba8c2feebc39586c.png

    我们可以通过计算机来看一下

    2c11094a57894f488d16254ddce90c88.png

    我们来看最后一道例题:

    1. unsigned char i = 0;//0~255
    2. int main()
    3. {
    4. for (i = 0; i <= 255; i++)
    5. {
    6. printf("Hello World\n");//死循环打印 因为unsigned char 范围为0~255 当i为255时,i++后会变成0 形成一个循环 所以for循环条件恒成立
    7. }
    8. return 0;
    9. }

    为什么会循环打印呢???我们知道unsigned char i

    的范围为0~255 又因为是无符号数,当i超过255时,会变成0

    所以满足for循环条件,一直打印

最后:希望通过这篇文章让你对无符号整数有更好的理解,我也会不定时更新,分享我的学习经历

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/519874
推荐阅读
相关标签
  

闽ICP备14008679号