以字节为单位显示变量的内存存储数据

地址:http://blog.csdn.net/morewindows/article/details/10021601

转载请标明出处,谢谢。

欢迎关注微博:http://weibo.com/MoreWindows    

 

之前在《位操作基础篇之位操作全面总结》中写了一个变量内存存储查看函数——PrintfBinary,代码如下:

template <class T>
void PrintfBinary(T a)
{
  int i;
  for (i = sizeof(a) * 8 - 1; i >= 0; --i)
  {
    if ((a >> i) & 1)
      putchar('1');
    else 
      putchar('0');
    if (i == 8)
      putchar(' ');
  }
  putchar('\n');
}

由于这个函数只能查看整型数据,对浮点数类型数据,结构体对象,类对象都不能查看。因此写了个功能强大点的,代码如下:

void PrintfBinaryOneByte(char cByte)
{
  for (int i = 7; i >= 0; --i)
  {
    if ((cByte >> i) & 1)  
      putchar('1');  
    else   
      putchar('0'); 
  }
}
// 从pStartAddress地址开始输出byteNum个字节
void PrintfBinaryByte(unsigned char *pStartAddress, int byteNum)
{
  // address
  for (int i = 0; i < byteNum; i++)
  {
    printf("0x%08x ", pStartAddress + i);
  }
  putchar('\n');
  // hexadecimal
  for (int i = 0; i < byteNum; i++)
  {
    unsigned char cByte = *(pStartAddress + i);
    printf("  %8x ", cByte);
  }
  putchar('\n');
  // decimal
  for (int i = 0; i < byteNum; i++)
  {
    unsigned char cByte = *(pStartAddress + i);
    printf("  ");
    PrintfBinaryOneByte(cByte);
    putchar(' ');
  }
  printf("\n\n");
}
// 以字节为单位显示变量的内存存储数据
// By MoreWindows (http://blog.csdn.net/MoreWindows)
template <class T>
void PrintfBinaryEveryByte(T &a)
{
  unsigned char* pstr = (unsigned char*)&a;
  int byteNum = sizeof(a);
  printf("首地址: 0x%08x 字节数: %d\n", pstr, byteNum);
  while (byteNum > 0)
  {
    PrintfBinaryByte(pstr, byteNum > 4 ? 4 : byteNum);
    byteNum -= 4;
    pstr += 4;
  }
  printf("\n\n");
}

测试一下:

#include <stdio.h>
struct Node1
{
  int i;
  char c;
};
struct Node2
{  
  char c;
  int i;
};
int main()
{ 
  printf("    以字节为单位显示变量的内存存储数据 \n");  
  printf(" - http://blog.csdn.net/morewindows/article/details/10021601 -\n");  
  printf(" -- By MoreWindows( http://blog.csdn.net/MoreWindows ) --\n\n");

  int i = 0x12345678;
  PrintfBinaryEveryByte(i);

  short s = 0xfeed;
  PrintfBinaryEveryByte(s);

  Node1 n1;
  n1.i = 0x12345678;
  n1.c = 'a';
  PrintfBinaryEveryByte(n1);

  Node2 n2;
  n2.i = 0x9abcdef0;
  n2.c = 'a';
  PrintfBinaryEveryByte(n2);

  char c = '0';
  PrintfBinaryEveryByte(c);

  double d = 1.0;
  PrintfBinaryEveryByte(d);

  return 0;
}

程序运行结果如下:

 

地址:http://blog.csdn.net/morewindows/article/details/10021601转载请标明出处,谢谢。

欢迎关注微博:http://weibo.com/MoreWindows  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值