char,int和float的二进制表示

时间:2014-06-15 11:00:04

标签: c

#include<stdio.h>

int binary(char* a){
        int bit_index = (sizeof(*a) * 8 - 1);
        int i;
        printf("\n bit_index : %d *a : %c \n",bit_index,*a);
        for(i = 0; i < bit_index; i++){
                printf("%d",(*a & (1 << i)));
        }
        printf("\n");
        return 0;
}
int main(){
        char a = 'a';
        int b = 67;
        float c = 3.14;
        binary(&a);
        return 0;
}

我正在将char转换为二进制表示。 上面的程序给出了一个垃圾o / p,

bit_index : 7 *a : a 
100003264

我希望上面的程序能够输入任何类型变量来转换为二进制表示。

所以我使用void *而不是char *作为func binary(void *)的参数。但是我在使用时遇到了错误,

binary.c: In function ‘binary’:
binary.c:17:50: warning: dereferencing ‘void *’ pointer [enabled by default]
binary.c:17:2: error: invalid use of void expression
binary.c:19:16: warning: dereferencing ‘void *’ pointer [enabled by default]
binary.c:19:3: error: void value not ignored as it ought to be

有没有办法创建一个函数来输入任何类型的变量并输出其二进制表示。

2 个答案:

答案 0 :(得分:1)

您不能取消引用void *指针。相反,要获取二进制表示,请将(二进制参数)作为void *并将其转换为char *,以便能够逐字节显示它。

您还应该使用size参数,因为各种数据类型具有各种大小。因此,对二进制的调用应该类似于binary(&a, sizeof(a))

答案 1 :(得分:1)

  1. 您要打印'1'或'0',而不是(*a & (1 << i))

    的结果

    printf("%d",(*a & (1 << i)) != 0);

    (或printf("%d",!!(*a & (1 << i)));

  2. 当您想要访问基础位时使用unsigned char,没有理由必须处理 一个char的潜在符号位,你应该传入你正在访问的类型的大小(因为char的大小总是1,你的sizeof *a总是1,即原型应该是

    int binary(void* a_, size_t len) { unsigned char *a = a_; //use a here to access the bits.

    你将其称为

    binary(&b, sizeof *b);

  3. 您可能希望先打印最高位而不是最低位。