我认为你们已经听说过像这样的代码
(c & (1 << i)) ? '1' : '0';
我已将它存储在一个数组中,但它给了我一个错误的二进制文件。 这是附加代码
int i;
char test[8];
for(i=7 ; i>=0; i--){
test[i] =(c &(1 << i)) ? '1' : '0';
}
int j = atoi(test);
printf("%d\n", j);
我的样本是:&#39;我&#39; 它给了我:100100109
答案 0 :(得分:3)
atoi(test);
的行为未定义。参数test
(一旦衰减为指针类型)必须指向NUL终止的char
数组。你的不是。
这里的解决方案很简单,写
char test[9] = {0};
而是强制包含NUL终止符。但请注意,结果数字大约为1000万;因此对于int
来说可能太大了。请改为使用long
以及atol
代替atoi
。如果您希望将字符串解析为二进制,那么使用strtol
传递2的基数。
答案 1 :(得分:0)
要将格式为base 2(“binary”)中字符串的数字转换为实际整数,请使用strtoul()
:
const unsigned long x = strtoul("11100011", NULL, 2);
printf("x=%lu\n", x);
最后2
指定了基数,2
当然会给出二进制,这会打印227
。
答案 2 :(得分:0)
正如其他答案中已经提到的,核心问题是你没有null终止字符串。但是这个程序还有其他各种不好的做法:
1
是签名类型。像1<<15
这样的代码将在8位和16位CPU上调用未定义的行为。更正的程序可能如下所示:
#include <stdio.h>
#include <stdlib.h>
int main (void)
{
unsigned int c = 100;
char test[8+1];
for(size_t i=0; i<8; i++)
{
test[i] = c & (1u<<(8-1-i)) ? '1' : '0';
}
test[8] = '\0';
int j = (int)strtol(test, NULL, 10);
printf("%.8d\n", j);
return 0;
}
或者,如果你生活和呼吸C语言运算符优先级(主要书呆子警告),你可能会自大,只需写test[i] = c & 1u << 8-1-i ? '1' : '0';
。由于此处的运算符优先级为:-
,<<
,&
,?:
,=
。