Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 某些输入的整数到二进制转换程序失败_C_Binary_Integer - Fatal编程技术网

C 某些输入的整数到二进制转换程序失败

C 某些输入的整数到二进制转换程序失败,c,binary,integer,C,Binary,Integer,我编写了获取整数二进制形式的代码。对于1或10这样的输入,它工作得很好。然而,对于256这样的输入,它是失败的。(它给出0000000秒的输出,但未命中该输出) #包括 #包括 需要整数个二进制数字(整数n){ 返回cell(log(n))+1; } 无效打印数组(int*a,int n){ int i=0; 对于(;i使用对数函数与ceil一起计算位数将由于浮点下冲而受到影响 计算二进制位数的一种更可靠的方法是反复除以2,直到得到零。C的log函数给出的结果以e为基数,而不是2为基数。这就是为

我编写了获取整数二进制形式的代码。对于1或10这样的输入,它工作得很好。然而,对于256这样的输入,它是失败的。(它给出0000000秒的输出,但未命中该输出)

#包括
#包括
需要整数个二进制数字(整数n){
返回cell(log(n))+1;
}
无效打印数组(int*a,int n){
int i=0;

对于(;i使用对数函数与ceil一起计算位数将由于浮点下冲而受到影响


计算二进制位数的一种更可靠的方法是反复除以2,直到得到零。

C的log函数给出的结果以e为基数,而不是2为基数。这就是为什么一些数字在您的程序中会给出意外的结果,因为您使用它进行计算。我认为有一个函数正是您所需要的。

桩号使用log(n),它计算n基e的对数

而是使用log2(n)


希望有帮助。:-

您甚至不需要提前计算位数。您可以将
num%2
中的数字写入缓冲区,直到
(num/=2)==0
,然后以相反的顺序打印,或者,以相反的顺序将它们存储在缓冲区中。@WeatherVane谢谢,我正试图以正向方式进行操作。.是否正确使用了反向方式。.我正在按您键入的方式编辑:您可以以相反的顺序存储它们,而无需知道数量。从足够大的缓冲区末尾开始,然后打印t从您停止的位置创建缓冲区。如果该缓冲区位于
binary[90]
,则您可以
printf(“%s”,binary+90);
但是你需要一个
NUL
终止符,还需要在每个数字进入缓冲区时向其添加
'0'
。为什么浮点计算错误?在mat.h.中日志函数没有正确实现。有什么替换吗?你能给出一个未命中的例子吗…这里我没有得到它。你已经在你的代码中看到了一个例子!G设置调试器。自然对数函数对于很多科学应用来说已经足够好了,但是它可能会出现在第15个有效数字上,或者更糟,但是使用ceil本质上会将平滑函数转换为不连续函数,这就是所有问题的症结所在。谢谢,但是log2是一个mi桩楼(log2)作品great@RONALDO69
round
可能比
floor
ceil
更好。使用日志数数数字时要非常小心。我喜欢你接受的答案,但它可能会咬你一口。也就是说,round会解决这个问题。哈。很好。即使如此,也有可能出现下冲。二进制浮点的可能性较小,但是WeatherVane:我还是不太小心。不过我会投票给这个答案。
round
可能比
ceil
好。@WeatherVane:确实会的。
#include <stdio.h>
#include <math.h>

int number_of_binary_digits_required(int n){

return ceil(log(n))+1;

}

void print_array(int * a, int n){

    int i = 0;
    for (;i<n;i++){
        printf("%d\t", a[i]);
    }

}


int main(){

int num = 256;
int binary[100];
int n = number_of_binary_digits_required(num);
int bin_digits = n-1;

while (num){

   int temp = num%2;
   num = num / 2;
   binary[bin_digits] = temp;
   //printf("%d\n", bin_digits);
   bin_digits--;

}

print_array(binary, n);

//printf("%d", number_of_binary_digits_required(num));
//for(bin_digits = 0;bin_digits < number_of_binary_digits_required(num);bin_digits++)
//printf("%d",binary[bin_digits]);


}