【问题标题】:binary representation of char, int and floatchar、int 和 float 的二进制表示
【发布时间】:2014-06-15 11:00:03
【问题描述】:
#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 as,

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

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

【问题讨论】:

  • 只需在现有函数中添加size 参数即可。
  • char 并不总是 8 位。而sizeof(char) 按标准总是 1,所以sizeof(*a)*8 应该是1*CHAR_BIT

标签: c


【解决方案1】:

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

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

【讨论】:

  • 实际上,取消引用指向 void 的指针本身并不非法,但使用 void 表达式是非法的。 C99 6.3.2.2:“不应以任何方式使用 void 表达式(具有 void 类型的表达式)的(不存在的)值,并且不应将隐式或显式转换(除了 void)应用于此类表达式。 ”。这也是编译器所说的 - 它只会在您取消引用指向 void 的指针时向您发出警告,但在您尝试使用 void 表达式时会产生错误。
【解决方案2】:
  1. 您想要打印“1”或“0”,而不是 (*a &amp; (1 &lt;&lt; i)) 的结果

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

    (或printf("%d",!!(*a &amp; (1 &lt;&lt; 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(&amp;b, sizeof *b);

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-16
    • 2016-09-24
    相关资源
    最近更新 更多