感悟int 和unsigned int——大小端内存分配。

在学习结构体成员位段的时候,遇到了这么一道题:

 

又如intel的笔试题:

#include      “stdafx.h”   

  #include      

  struct   bit  

  {   

int   a:3; 

    int   b:2; 

    int   c:3;

  };

  int   main(int   argc,   char*   argv[])    

  {     

bit   s;     

  char   *c   =   (char*)&s;     

  *c   =   0x99;     

  cout<

  return   0;     

  }

 Output:?  

 运行的结果是   1   -1   -4  

结构bit的成员在内存中由低地址到高地址顺序存放,执行 *c=0x99;后成员的内存分布情况为:

 

 

注意:我们通常用的pc都是intel的CPU。xp系统,都是小段模式:也就是。一个整数的高位存在高地址上。低位存在低地址上。还不通俗么?这么说吧。一个整数。千位存的地址位比百位的要大。百位存的地址比十位的要大。十位存的地址比个位要大。这么说可能更糊涂。如果计算机中用十进制存数据的话。那么就是这样的。只不多是在计算机中是以二进制存的。也就是。假设一个二进制为abcd。四位的二进制。a、b、c、d、四个字母可为0或1.那么这个二进制表达的十进制为:a*2^3+b*2^2+c*2^1+d。所以在小端模式下。a的地址比b高。b的地址比C高。c的地址比d高。存储的时候,地址由小到大里面存的应该是dcba。

我想我我说的更清楚了吧。

 

对比上图:a对应的地址存的二进制应该是int 类型 的二进制001。b对应的地址里面存的是二进制11(int)。c对应的地址里面存的应该是二进制100(int)。

知道我什么强调这些二进制是int类型的么?

因为这些二进制是以int类型存储在计算机里的。

 

读出的时候,我们会把他们按照%d的格式读出。

 

我说的是废话么?

 

这个时候,计算机知道你要将他们按照%d的格式读出,那么,计算机这道每个二进制的最左位为正负标志位。

 

那么int类型的二进制110。减1后为011.取反码为100.也就是其十进制为-4.

我们知道,int类型存储时,是按照补码的形式存储的。在32位的系统中,最左侧为正负标志位。右侧31位为数据位。标志的范围为-2^31至2^31-1。在本例中,已是如此的。只是该处的int类型是用3位来标识的。取值范围为-4到3.共8个数。3位的int型无法标识4。

 

你可能感兴趣的:(C,language,programing,存储,output,c,xp)