c-为什么显示错误的二进制数字



代码:

#include <stdio.h>
#include <stdlib.h>

int main()
{
long int x;
x = 1000000;
printf("%ldn", x);
for(int i = 0; i < 32; i++)
{
printf("%c", (x & 0x80) ? '1' : '0');
x <<= 1;
}
printf("n");
return 0;
}

这段代码本应将十进制int转换为二进制,但为什么它不能正常工作?

附言:我通过将0x80替换为0x80000000解决了这个问题。但是为什么0x80显示的数字不对呢?

EDIT2:
OP询问"附言:我通过将0x80替换为0x80000000解决了这个问题。但是为什么0x80显示的数字不对呢">

错误的是0x80等于0x00000080。0x80将永远不会测试b7以上的任何位(其中从右到左的位编号为b0到b31。

校正后的值0x80000000将MSB设置为高,并且可以在数据值向左"滚动"时用于(某种程度上)对数据的每一位进行"采样"。
//结束编辑2

两个问题:
1) 篡改有符号整数的符号位可能会有问题
2) ";知道";存在32个比特可能是有问题的。

以下是较少的假设。它创建一个位掩码(只有MSB设置在无符号的int值中),并将该掩码移向LSB。

int main() {
long int x = 100000;
printf("%ldn", x);
for( unsigned long int bit = ~(~0u >> 1); bit; bit >>= 1 )
printf("%c", (x & bit) ? '1' : '0');
printf("n");
return 0;
}
100000
00000000000000011000011010100000

额外的好处:这是一个不涉及分支的打印声明版本:

printf( "%c", '0' + !!(x & bit) );

编辑:
看到@Lundin的答案后,插入SP以提高可读性的建议是一个极好的想法!(全部归功于@Lundin。)

下面,不仅将输出的比特的长串划分为"0";"十六进制";块,但编译时的值显示为1000万。(1e7也可以。)

一个新的改进版本:

#include <stdio.h>
#include <stdlib.h>
int main() {
long int x = 10 * 1000 *1000;
printf("%ldn", x);
for( unsigned long int bit = ~(~0u >> 1); bit; bit >>= 1 ) {
putchar( '0' + !!(x & bit) );
if( bit & 0x11111111 ) putchar( ' ' );
}
putchar( 'n' );
return 0;
}
10000000
0000 0000 1001 1000 1001 0110 1000 0000

1000000 dec=111110100001001000000 bin
80十六进制=10000000 bin
这根本没有多大意义:

11110100001001000000
&             10000000

相反,将循环体固定为这样的东西:

#include <stdio.h>
#include <stdlib.h>
int main (void)
{
long int x;
x = 1000000;
printf("%ldn", x);
for(int i = 0; i < 32; i++)
{
unsigned long mask = 1u << (31-i);
printf("%c", (x & mask) ? '1' : '0');
if((i+1) % 8 == 0) // to print a space after 8 digits
printf(" ");
}
printf("n");
return 0;
}

如果不使用整数计数器来查看第i个位置的数字,您可以在第i次迭代中使用一个等于2^i的无符号变量。如果这个变量是无符号的,当它溢出时,它将变为零。以下是代码的外观。它以相反的顺序显示数字(第一个位置表示数字的多项式分解中的系数2^0)。

int
main()
{
int x;
x = 1000000;
printf("%lxn", x);
for(unsigned b = 1; b; b<<=1)
printf("%c", x & b ? '1':'0');
printf("n");
return 0;
}

我会使用函数

void printBin(long int x)
{
unsigned long mask = 1UL << (sizeof(mask) * CHAR_BIT - 1); 
int digcount = 0;
while(mask)
{
printf("%d%s", !!(x & mask), ++digcount % 4 ? "" : " ");
mask >>= 1;
}
}
int main(void)
{
printBin(0); printf("n");
printBin(1); printf("n");
printBin(0xf0); printf("n");
printBin(-10); printf("n");
}

相关内容

  • 没有找到相关文章

最新更新