C数据类型混乱

时间:2013-10-27 18:18:53

标签: c

当我输入大数字如3,000,000,000(没有逗号)时,我得不到正确的结果。无论我输入的数字有多大,显示的数字都不会超过9位数。

问题如下:

  

执行以下计算,其中系统仅接受从03x109的正整数(即3,000,000,000),并将结果显示为VDU输出:y = 3x2 - 2x + 6

     

如果数字是整数或在范围内,则无需签入算法。我们假设它总是正确输入。但是,您必须尝试使用​​正确的数据类型进行编码。请检查本书中的数据类型是否使用了在定义范围内的正整数

这是代码

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

int main()
{
    unsigned x=0, y=0;

    printf("Enter a positive number between 0 to 300000000\n");
    scanf("%u",&x);

    y=(3*x*x)-(2*x)+6;

    printf("\n\nThe value of y is %u",y);

    return 0;
}

3 个答案:

答案 0 :(得分:1)

您使用的scanf / printf格式代码错误。 %d是有符号整数。使用%u表示无符号整数。

正在发生的事情是scanf %d正在将用户输入读取为有符号整数,并将以负数扫描。 scanf不会检查传入的变量的数据类型,因此它会存储在无符号变量中 - 但是它不会存储为-10,因为变量是无符号的。相反,由于负数的存储方式(Two's complement),这将是一个非常大的正数。

正确的输入操作需要一些工作,这就是为什么你的指示要忽略它。

答案 1 :(得分:0)

x不能取值-10。如您的问题中所述,您无需检查值,因为假定始终正确输入。通过使用-10,你就失败了。只需在支票中使用正数。

编辑:此外,使用unsigned暗示unsigned int。如果您使用的c-int是32位int,而不是16位int,则最大数量只能适合int。

EDIT2:除了必须在scanf函数中使用%u之外,还需要使用给定的格式输出。那就是你需要在屏幕上可视化你的计算线。

所提供的信息应该足以让您找出答案。这是一项任务,你应该自己做点什么,对吗?

答案 2 :(得分:0)

因为价值大于最大值。整数数据类型的限制因此,如果输入的值大于整数范围而不是它将翻转,这就是你没有得到正确值的原因。 所以对于这个,如果你想避免这个问题,你必须使用长整数,而不是你会得到正确的值