您的位置:首页 > 其它

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

2013-08-21 12:56 274 查看
地址:/article/1392141.html转载请标明出处,谢谢。欢迎关注微博: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(" - /article/1392141.html -\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;
}
程序运行结果如下:




地址:/article/1392141.html转载请标明出处,谢谢。欢迎关注微博:http://weibo.com/MoreWindows
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐