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

来源:互联网 发布:尚学堂java培训怎么样 编辑:程序博客网 时间:2024/05/16 18:40

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

转载请标明出处,谢谢。

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

 

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

[cpp] view plain copy
  1. template <class T>  
  2. void PrintfBinary(T a)  
  3. {  
  4.   int i;  
  5.   for (i = sizeof(a) * 8 - 1; i >= 0; --i)  
  6.   {  
  7.     if ((a >> i) & 1)  
  8.       putchar('1');  
  9.     else   
  10.       putchar('0');  
  11.     if (i == 8)  
  12.       putchar(' ');  
  13.   }  
  14.   putchar('\n');  
  15. }  

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

[cpp] view plain copy
  1. void PrintfBinaryOneByte(char cByte)  
  2. {  
  3.   for (int i = 7; i >= 0; --i)  
  4.   {  
  5.     if ((cByte >> i) & 1)    
  6.       putchar('1');    
  7.     else     
  8.       putchar('0');   
  9.   }  
  10. }  
  11. // 从pStartAddress地址开始输出byteNum个字节  
  12. void PrintfBinaryByte(unsigned char *pStartAddress, int byteNum)  
  13. {  
  14.   // address  
  15.   for (int i = 0; i < byteNum; i++)  
  16.   {  
  17.     printf("0x%08x ", pStartAddress + i);  
  18.   }  
  19.   putchar('\n');  
  20.   // hexadecimal  
  21.   for (int i = 0; i < byteNum; i++)  
  22.   {  
  23.     unsigned char cByte = *(pStartAddress + i);  
  24.     printf("  %8x ", cByte);  
  25.   }  
  26.   putchar('\n');  
  27.   // decimal  
  28.   for (int i = 0; i < byteNum; i++)  
  29.   {  
  30.     unsigned char cByte = *(pStartAddress + i);  
  31.     printf("  ");  
  32.     PrintfBinaryOneByte(cByte);  
  33.     putchar(' ');  
  34.   }  
  35.   printf("\n\n");  
  36. }  
  37. // 以字节为单位显示变量的内存存储数据  
  38. // By MoreWindows (http://blog.csdn.net/MoreWindows)  
  39. template <class T>  
  40. void PrintfBinaryEveryByte(T &a)  
  41. {  
  42.   unsigned char* pstr = (unsigned char*)&a;  
  43.   int byteNum = sizeof(a);  
  44.   printf("首地址: 0x%08x 字节数: %d\n", pstr, byteNum);  
  45.   while (byteNum > 0)  
  46.   {  
  47.     PrintfBinaryByte(pstr, byteNum > 4 ? 4 : byteNum);  
  48.     byteNum -= 4;  
  49.     pstr += 4;  
  50.   }  
  51.   printf("\n\n");  
  52. }  

测试一下:

[cpp] view plain copy
  1. #include <stdio.h>  
  2. struct Node1  
  3. {  
  4.   int i;  
  5.   char c;  
  6. };  
  7. struct Node2  
  8. {    
  9.   char c;  
  10.   int i;  
  11. };  
  12. int main()  
  13. {   
  14.   printf("    以字节为单位显示变量的内存存储数据 \n");    
  15.   printf(" - http://blog.csdn.net/morewindows/article/details/10021601 -\n");    
  16.   printf(" -- By MoreWindows( http://blog.csdn.net/MoreWindows ) --\n\n");  
  17.   
  18.   int i = 0x12345678;  
  19.   PrintfBinaryEveryByte(i);  
  20.   
  21.   short s = 0xfeed;  
  22.   PrintfBinaryEveryByte(s);  
  23.   
  24.   Node1 n1;  
  25.   n1.i = 0x12345678;  
  26.   n1.c = 'a';  
  27.   PrintfBinaryEveryByte(n1);  
  28.   
  29.   Node2 n2;  
  30.   n2.i = 0x9abcdef0;  
  31.   n2.c = 'a';  
  32.   PrintfBinaryEveryByte(n2);  
  33.   
  34.   char c = '0';  
  35.   PrintfBinaryEveryByte(c);  
  36.   
  37.   double d = 1.0;  
  38.   PrintfBinaryEveryByte(d);  
  39.   
  40.   return 0;  
  41. }  

程序运行结果如下:

 

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

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

0 0
原创粉丝点击