这是一个十进制到二进制的转换器,用户输入一个十进制数,并输出其二进制版本.它工作正常,除非输入数字(在此代码中显示为变量'a')大于16383.我不太清楚为什么.另一个奇怪的事情是,当16383用作输入数字时,二进制输出只是1的长序列.不确定这是否是答案的线索.
无论如何,这是代码:
#include<stdio.h>
#include<conio.h>
void main()
{
clrscr();
int a,x=1;
printf("Enter your number in base 10:");
scanf("%d",&a);//max value:16383 for some reason??
while(x<=a)
{
x=x*2;
}
x=x/2;
printf("\nBinary version:");
if(x==1)
printf("1");
else
{
while(x>=1)
{
if(a/x==1)
{
printf("1");
a=a-x;
}
else
printf("0");
x=x/2;
}
}
getch();
}
Run Code Online (Sandbox Code Playgroud)
你,不管怎样,一个16位的机器上工作(这里sizeof(int)是2)?
因为16383是0x3fff.还有一个是0x4000,在这里加倍时...
while(x<=a)
{
x=x*2;
}
Run Code Online (Sandbox Code Playgroud)
...会给出0x8000,这将在16位机器上包含负值.
(以防你不熟悉0x...,这是十六进制表示法,这使得更容易看到位模式.)
int是签名类型,即它可以保留负数.在大多数现代平台上,底片是具有最重要位设置的底片.那将是0x8000-0xffff16位机器和0x80000000-0xffffffff32位机器.
因此,越来越大的正数(0x7ffe,0x7fff)可能突然变成小的负数(0x8000).如果您使用的是无符号类型(即unsigned int),则会从"非常大"到"零"获得类似的"环绕".
在你的机器上,16383次两次是32766.
但16384次两次(由于有限的数字范围,可以用16位表示)实际上是-2 - 此时您的程序会中断.