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

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

 

又如intel的笔试题:

#include      “stdafx.h”   

  #include   <iostream.h>   

  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<<s.a<<endl<<s.b<<endl<<s.c<<endl;   

  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。

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值