问题引出
C语言中,在需要用到16进制数据的时候,可以通过printf
函数的%x
格式打印数据的16进制形式。在某些位标记、位操作的场合,需要用到2进制格式的数据,但printf
函数不能输出2进制格式,虽然可以通过使用itoa
或_itoa
的方法转为2进制的字符串打印,但显示的长度是不固定的,无法显示有效数位前面的0。
例如:现在需要打印数字258的2进制格式,且需要将32位全部显示出来,即想要得到结果00000000 00000000 00000001 00000010
,而使用_itoa
的方法和打印结果为:
int a = 258;char s[32];_itoa(a, s, 2);printf("a --> %s\n", s);
a --> 100000010
不是我们想要的显示32位的格式!
数据存储原理探析
那要怎么办呢?自己写个小程序吧,思路如下:
首先弄清楚数据在计算机中是如何存储的,对于int型数字,在32或64位计算机中都占4个字节,而计算机中的数据存储是以字节(Byte)为单位,1个字节包含8个位(bit),例如,数字258的16进制形式为0x00000102
,2进制形式为:00000000 00000000 00000001 00000010
,其在计算机内存中的存储方式如图所示:
右侧的16进制数是内存的地址,向上递增,方框里的二进制数是内存单元实际存储的字节内存,我们可以通过程序测试验证一下,因为unsigned char或char类型在系统是占用一个字节,因此可以定义该变量的指针,分别指向int的4个字节,打印其内存地址和实际存储的内存进行验证,代码如下:
int a = 258;//使用unsigned char来验证int的每一个字节unsigned char *p1 = (unsigned char*)&a; /