如果我在这个将十进制转换为二进制的 C 程序中输入一个大于 16383 的值,它将不起作用。为什么?
If i enter a value above 16383 in this C program that converts decimal to binary, it doesn't work. Why?
这是一个十进制到二进制的转换器,用户输入一个十进制数并输出其二进制版本。它工作正常,除非输入数字(在此代码中显示为变量 '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();
}
检查您的整数的大小,它们可能是 16 位,我认为 16383 是适合带符号的 16 位整数的最大整数。
printf("%i",sizeof(int));
你是不是在 16 位机器上工作(sizeof(int)
是 2
)?
因为 16383 是 0x3fff
。还有一个是 0x4000
,在这里加倍时...
while(x<=a)
{
x=x*2;
}
...会给出 0x8000
,这会在 16 位机器上换成负值。
(以防万一你不熟悉 0x...
,即 hexadecimal 符号,这样更容易看到位模式。)
int
是 signed 类型,即它可以容纳负数。在 most modern platforms 上,负数是设置了最高有效位的那些。对于 16 位机器是 0x8000-0xffff
,对于 32 位机器是 0x80000000-0xffffffff
。
因此,越来越大的正数 (0x7ffe
、0x7fff
) 可能会突然变小 负数 (0x8000
)。如果您使用 unsigned 类型(即 unsigned int
),您会得到从 "really large" 到 "zero" 的类似 "wraparound"。
在你的机器上,16383 乘以二是 32766。
但是 16384 乘以二(由于可以用 16 位表示的数字范围有限)实际上是 -2 -- 在这一点上你的程序中断了。
这是一个十进制到二进制的转换器,用户输入一个十进制数并输出其二进制版本。它工作正常,除非输入数字(在此代码中显示为变量 '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();
}
检查您的整数的大小,它们可能是 16 位,我认为 16383 是适合带符号的 16 位整数的最大整数。
printf("%i",sizeof(int));
你是不是在 16 位机器上工作(sizeof(int)
是 2
)?
因为 16383 是 0x3fff
。还有一个是 0x4000
,在这里加倍时...
while(x<=a)
{
x=x*2;
}
...会给出 0x8000
,这会在 16 位机器上换成负值。
(以防万一你不熟悉 0x...
,即 hexadecimal 符号,这样更容易看到位模式。)
int
是 signed 类型,即它可以容纳负数。在 most modern platforms 上,负数是设置了最高有效位的那些。对于 16 位机器是 0x8000-0xffff
,对于 32 位机器是 0x80000000-0xffffffff
。
因此,越来越大的正数 (0x7ffe
、0x7fff
) 可能会突然变小 负数 (0x8000
)。如果您使用 unsigned 类型(即 unsigned int
),您会得到从 "really large" 到 "zero" 的类似 "wraparound"。
在你的机器上,16383 乘以二是 32766。
但是 16384 乘以二(由于可以用 16 位表示的数字范围有限)实际上是 -2 -- 在这一点上你的程序中断了。