之前在《位操作基础篇之位操作全面总结》中写了一个变量内存存储查看函数——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转载请标明出处,谢谢。