C语言 | 您所在的位置:网站首页 › c语言取整数符号怎么写 › C语言 |
C语言——整数的存储
这里说的整数主要是指:short 、 char和int类型的数字。本文将详细介绍整数在内存中的存储方式和运算逻辑。 这里首先说明32位机器和64位机器代表的含义:32和64表示内存中地址线的个数。32位表示内存共有 我们常用的整数数据类型有:char(1B)、short(2B)和int(4B)型。而short、char和int型的数字主要分为二类(有符号和无符号)。 char a; 等效于 signed char a; 定义无符号char 型:unsigned char a; short a; 等效于 signed short a; 定义无符号short 型:unsigned short a; int a; 等效于 signed int a; 定义无符号int 型:unsigned int a; 我们都知道在内存中存储的数据,都是以字节为单位进行存储。并且任何数据在内存中都被存储成0 1组成的二进制序列。如果是有符号数:则其二进制的最高位为符号位(符号位0表示正数,1表示负数)。 那么数据的地址是怎么分配的?对于一个简单的程序: int a=0x11223344; int b=0x01020304;a和b在被存储到内存中时,a和b的地址是系统随机分配的吗?二者又有什么关系呢? 这里先给出答案:a和b的地址并不是系统随机取分配的,并且a和b的地址之间存在联系。下面将通过测试给出验证。(本人使用的C语言编译器为Visual Stdio2019) 我们首先验证a和b的地址并不是系统随机分配的。在验证之前我们首先学习二个名词:大端(大端字节序)和小端(小端字节序)。 大端(大端字节序):指数据的低位保存在内存的高地址中。 小端(小端字节序):指数据的低位保存在内存的低地址中。 注释:(1)什么是数据的低位:一个简单的例子是,一个十进制数123,它的最高位是1还是3? 所以,写出来的数据,右边的数据就是低位数据。(比如说一个字节的二进制数:1000 0001,左边的1就是最高位,右边的1就是最低位)。 (2)内存的低地址:上文中说到32位系统的内存有 有了上述概念后,那么a的数据在内存中的分别是怎样的?我们的系统到底是大端还是小端呢?下面编写代码进行验证。 这里需要注意:大端小端针对的是编译器,即同一台电脑,不同的编译器,得到的结果可能不同。(这里我们验证Visual Stdio是大端还是小端) 验证1:数据在内存中是怎么放的? 验思路,程序中查看a b内容的地址分布。 #include < stdio.h > //验证代码 int main() { int a = 0x11223344; int b = 0x01020304; return 0; }图1
图2 由图1可以看出,a的四个字节内容在内存中的分布是连续的,并且a的低位(44)对应的内存地址是最低的。使用Visual Stdio是小端字节序。 由图2可以看出,b的内容在内存中的分别也符合小端字节序。并且b的起始地址(0x010FFA78)比a的起始地址(0x010FFA84)要低。在程序中,定义a要比定义b早,所以变量在内存中存储时,先使用高地址内存。为了更直观,下面上图说明。 变量在内存中存储流程![]() 验证(2):变量a的起始内存地址和变量b的最高位内存地址并不是连续的,程序中我们定义a和b是连续的,中间并没有穿插其它程序。有一种自欺欺人的解释是:我们的电脑同时可以干很多工作,a和b中间的内存是不是被其它未知程序给占用了? 验证这一点也很容易,我们定义三个变量(int a=0x11223344; int b=0x01020304; int c=0x11223344;),如果这三个变量之间间隔的内存空间大小是随机的(即a和b中间间隔m个字节,b和c中间间隔n个字节。如果m和n都是随机的,每次运行程序m和n的值都不一样,则说明a和b中间的内存是被其它未知程序给占用了) #include < stdio.h > int main() { int a = 0x11223344; int b = 0x01020304; int c = 0x11223344; return 0; } 变量a b c在内存中地址由左图可以看出,c与b之间间隔8个字节,a与b间隔8个字节。并且本人共测试5次,每次的结果都是一致的。所以程序中连续定义的变量在内存中的地址是存在联系的。但其规律并不好把控,如果a b c 都是整型,他们的间隔是8个字节。如果a还是int型,将b改为char型,c改为short型,那么a b间隔11个字节,b c间隔8个字节,并没有明显的规律性。 为了搞明白这个问题,我去百度。 百度的结果说:不要试图理解编译器的行为。(好吧!) 数据在内存中的存储方式与编译器有关,那么研究相邻变量的地址关系是不是就没用了呢? 下面我将列举一个经典的例题。 #include int main() { int i = 9; //定义为9 方便在内存中查看 int arr[] = { 1,2,3,4,5,6,7,8,9,10}; for (i = 0; i |
CopyRight 2018-2019 实验室设备网 版权所有 |