整型数据在内存中存储方式的讲解

(以下讨论,针对32位的计算机系统。。)

问:int型数据占几个字节?答:4字节。地球上这个群体的人都知道。

再问:这4个字节,即32个二进制位,又是何存储?这就进入计算机的“底层”了。这个事情,学习程序设计的童鞋,可以懂。

存储的方式,和我们拍脑袋想得不太一样,概括一下,就是低位在前,高位在后。

本文直观一些,看懂以下程序中数据的存储,也便知道这个安排。

(源程序,及在watch窗口中用多种方式看x.c的方法,见文后附件。)

在程序中,由于联合体存储的特点,变量x占4个字节。我们可以从3个角度观察这4个字节:(1) 整体看,是一个int型数据;(2) 分成2部分看,是两个短整型数据;(3) 分成4部分看,是4个单字节的数据。

但无论怎么看,就是这4个字节。无论用哪种形式操作数据,使用的也就是这4个字节。联合体为我们提供了从不同的角度使用这4个字节的方式。

x.c[0]到x.c[3]的值分别为65\66\67\68,这好理解。

x.si[0]占的2字节,与x.c[0]和x.c[1]相同。验证一下:16961=66×256+65(66是'B'的ACSII值,65是'A'的ASCII值,是字符的存储形式)。注意,这里体现存储数据时低位在前,高位在后,低位是65,高位是66。正如十进制数98中,高位是9,低位是8,所以98=9×10+8一样。因为是高位,所以乘以位权10,表示9这个符号代表的其实是90。66×256,是因为存储66(‘B')的那一个字节的位置,比存储65(‘A')的那一个字节的位置高8位,所以乘以2的8次方,即256。

概括讲,存储2字节的16961时,其低8位,是65,在前(x.c[0]),而其高8位,是66,在后(x.c[1])。低位在前,高位在后。

请自行验证:17475=68×256+67,体现低位在前,高位在后。(x.si[0]占的2字节,与x.c[2]和x.c[3]相同)

再请验证:1145258561=17475×256×256+16961,也体现低位在前,高位在后。(x.i占的4字节,与x.si[0]和x.si[1]相同)

再请验证:1145258561=68×256×256×256+67×256×256+66×256+65。同样的道理。

换种写法,是1145258561=(((68×256+67)×256+66)×256+65。

再看截图,品味低位在前,高位在后。

这样安排的道理,在以后的关于“计算机的原理”的有关专业课中会接触到。

附1:本文源程序

#include <iostream>
using namespace std;
union un
{
  int i;
  short int si[2];
  char c[4];
};
int main()
{
  union un x;
  x.c[0]='A';
  x.c[1]='B';
  x.c[2]='C';
  x.c[3]='D';
  cout<< x.c[0]<<","<<x.c[1]<<","<< x.c[2]<<","<< x.c[3]<<endl;
  cout<<x.si[0]<<","<< x.si[1]<<endl;
  cout<<x.i<<endl;
  return 0;
}

附2:在watch窗口中用多种方式看x.c的方法

在watch窗口中,除自动显示的局部变量的值,还可以自行输入表达式跟踪。

方法是,直接在表格中写下表达式,如图中,x.c,其他任意。

输入表达式后,在上面点右键,会有几个选项,点properties…(属性),然后就是如下的窗口:

任性地多角度观察吧!

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对我们的支持。如果你想了解更多相关内容请查看下面相关链接

(0)

相关推荐

  • Python使用ctypes调用C/C++的方法

    python使用ctypes调用C/C++ 1. ctpes介绍 ctypes is a foreign function library for Python. It provides C compatible data types, and allows calling functions in DLLs or shared libraries. It can be used to wrap these libraries in pure Python. 官方文档地址: https://do

  • C++实践数组类运算的实现参考

    [项目-数组类运算的实现] 设计数组类Array,为了实现测试函数中要求的功能,请补足相关的函数(构造.析构函数)和运算符重载的函数. 实现策略提示:可以将测试函数中的语句加上注释,取消一句的注释,增加相应的函数,以渐增地实现所有的功能,避免全盘考虑带来的困难. class Array { private: int* list; //用于存放动态分配的数组内存首地址 int size; //数组大小(元素个数) public: //成员函数声明 }; //要求测试函数能够运行出正确.合理的结果:

  • C++二维数组中数组元素存储地址的计算疑问讲解

    关于二维数组中数组元素的存储地址,有同学问出了个好问题. 在我的课件中,出现了下面的讲解: a[i][j]的地址是p+(i*col+j)*d(d是数组元素所占的字节数). 同学编程序进行验证,出问题了: 地球停止转动了也必须先赞这种学习方式! 同学问:"老师,第一张图的4,我怎么觉得不对呢?第二张图我没4,结果好像也对,这里面差在哪呢?" 我的答复:"两个都对." 第一张图在讲原理,是我们在人脑里面要以"字节"为单位计算,p为首地址,单位是字节,

  • C++实践Time类中的运算符重载参考方法

    [项目-Time类中的运算符重载] 实现Time类中的运算符重载. class CTime { private: unsigned short int hour; // 时 unsigned short int minute; // 分 unsigned short int second; // 秒 public: CTime(int h=0,int m=0,int s=0); void setTime(int h,int m,int s); void display(); //二目的比较运算符

  • Android Java调用自己C++类库的实例讲解

    Android Java 如何调用自己的 C++ 的类库 下面以 Java 调用 C++ 的加法运算函数为例,做简单说明. (使用 Android Studio 3 编译) 首先编译 c++ 类库 创建独立目录存放 c++ 文件,例如 "app/src/main/cpp/add.cpp",内容如下 #include <jni.h> extern "C" JNIEXPORT jint JNICALL Java_com_example_liyi_demo_U

  • 剑指offer之C++语言实现链表(两种删除节点方式)

    1 问题 用C++语言实现链表 2 代码实现 #include <iostream> #include <stdlib.h> using namespace std; class List { public: List(); ~List(); List* createNode(int value);//创建节点 bool insertNode(List *node);//插入节点 void printList();//打印节点 bool deleteNode(List *node)

  • C++实践分数类中运算符重载的方法参考

    [项目-分数类中的运算符重载] (1)实现分数类中的运算符重载,在分数类中可以完成分数的加减乘除(运算后再化简).比较(6种关系)的运算. class CFraction { private: int nume; // 分子 int deno; // 分母 public: //构造函数及运算符重载的函数声明 }; //重载函数的实现及用于测试的main()函数 (2)在(1)的基础上,实现分数类中的对象和整型数的四则运算.分数类中的对象可以和整型数进行四则运算,且运算符合交换律.例如:CFrac

  • C++实践排序函数模板项目的参考方法

    [项目-排序函数模板] 已知 void Sort(int a[],int size); void Sort(double a[],int size); 是一个函数模板的两个实例,其功能是将数组a中的前size个元素按从小到大顺序排列.试设计这个函数模板. 参考解答: #include<iostream> using namespace std; template<class T> void Sort(T set[],int n) { int i,j; T temp; for(i=1

  • 一张图总结C++中关于指针的那些事

    指向对象的指针,指向数据成员的指针,指向成员函数的指针: 数组即指针,数组的指针,指针数组: 指向函数的指针,指向类的成员函数的指针,指针作为函数参数,指针函数: 指针的指针,指向数组的指针:常指针,指向常对象的指针: -- 大哥,这些都是什么鬼?! 用下面一张图全概括.用例子对照图示,有感觉,就用术语将概念大声地念出来,动员所有的感官参与,搞清楚这些,不是事. 图如下: 总结 以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对我们的支持.如果你想

  • C++实践数组作数据成员的参考

    [项目 - 数组作数据成员]下面是设计好的一个工资类(Salary): class Salary { public: void set_salarys( );//输入职工工资(输入-1标志着工资输入结束),工资保存到salary数组中,实际人数保存到number中: void add_salarys(int x); //给每个人涨x元工资 void sort_salarys(); //对工资由大到小排序 void show_salarys( ); //显示工资信息 private: double

随机推荐