C代码实现
分析了这么多,可以编写代码来输出一个数字的2进制格式形式了。具体的代码实现:
void printf_bin(int num){ int i, j, k; unsigned char *p = (unsigned char*)&num + 3;//p先指向num后面第3个字节的地址,即num的最高位字节地址 for (i = 0; i < 4; i++) //依次处理4个字节(32位) { j = *(p - i); //取每个字节的首地址,从高位字节到低位字节,即p p-1 p-2 p-3地址处 for (int k = 7; k >= 0; k--) //处理每个字节的8个位,注意字节内部的二进制数是按照人的习惯存储! { if (j & (1 << k))//1左移k位,与单前的字节内容j进行或运算,如k=7时,00000000&10000000=0 ->该字节的最高位为0 printf("1"); else printf("0"); } printf(" ");//每8位加个空格,方便查看 } printf("\r\n");}
数字258的实际运行效果:
00000000 00000000 00000001 00000010
对应unsigned char型的数字,如果只需要显示8位2进制数,可以对上述小程序简化:
void printf_bin_8(unsigned char num){ int k; unsigned char *p = (unsigned char*)# for (int k = 7; k >= 0; k--) //处理8个位 { if (*p & (1 << k)) printf("1"); else printf("0"); } printf("\r\n");}
数字12的运行结果:
00001100
关于负数
上面测试的都是正数,当然,对于负数,也是可以显示的,因为负数在计算机中是以对应正数的补码来存储的,因而显示的2进制数也是补码形式,这里顺便再复习一下补码:
对于负数-9,对应的正数位9,9的原码,反码,补码如下:
这里只画出8位示意,int型数字实际是占32位,对应的高位全是0或1。
使用程序测试一下-9的2进制格式输出:
11111111 11111111 11111111 11110111
可以正确显示。