Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C Printf是负片_C_Negative Number - Fatal编程技术网

C Printf是负片

C Printf是负片,c,negative-number,C,Negative Number,我是编程新手,我正在尝试让我的程序取一个给定的数字,加倍,然后继续加倍,不管用户输入多少天。我做了这个循环,它工作了,但是最后的数字是负数。我不知道如何才能阻止它的负面影响,如果有任何帮助,我将不胜感激 int main(void) { int d; int s; float a; do { printf ("Please enter the amount of days in the month: "); d = Ge

我是编程新手,我正在尝试让我的程序取一个给定的数字,加倍,然后继续加倍,不管用户输入多少天。我做了这个循环,它工作了,但是最后的数字是负数。我不知道如何才能阻止它的负面影响,如果有任何帮助,我将不胜感激

int main(void)
{

    int d;
    int s;
    float a;

    do
    {
        printf ("Please enter the amount of days in the month: ");
        d = GetInt();   
    } while (d > 31 || d < 28);

    do 
    { 
        printf("Please enter the amount of pennies you start will start with: ");
        s = GetInt();
    } while( s < 0);

    do 
    {    
        s = s * 2;
        d = d - 1;
        a = s / 100.0;
        printf("%f\n", a);

    } while(d > 0);

    return 0;
}
int main(无效)
{
int d;
int-s;
浮动a;
做
{
printf(“请输入当月天数:”);
d=GetInt();
}而(d>31 | d<28);
做
{ 
printf(“请输入开始时的硬币数量:”);
s=GetInt();
}s<0;
做
{    
s=s*2;
d=d-1;
a=s/100.0;
printf(“%f\n”,a);
}而(d>0);
返回0;
}
问题在于:

s=s*2;
(尽管您应该确保始终在循环之前初始化变量,例如
s=0
。)

当数字大于存储类型时,整数没有特殊的值,因此它们是

这里有一个可能发生的例子。假设我们将整数存储为一系列4位,其中第一位表示数字为负数。如果我们在系统中开始计数,我们会得到以下结果:

0000 = 0
0001 = 1
0010 = 2
0011 = 3
0100 = 4
0101 = 5
0110 = 6
0111 = 7
1000 = -0
1001 = -1
1010 = -2
所以你可以看到计算机内部的数字在不断增长,但是当最重要的位被打开时,它们转换成的数字突然变成了负数

计算机使用各种不同的方案来存储负数,但这是很常见的。它比我在这里用来解释事情的系统更聪明,但基本点是一样的:当数字变得太大时,它们会变成负数。在
int
的情况下,交叉点通常是在您点击
2^31
或2147483648时

一种解决方法是使用
无符号int
,它大约是可以表示的最大数字的两倍,或者
long
long
无符号long
、或者
无符号long
。记住,这并不能解决你的问题,它只会在问题出现之前给你更多的数字

您可以使用头文件找到最大的可用值;对于
int
而言,它是
int\u MAX

2^31 = 2147483648
如果超过30天,即使从1便士开始并将值加倍,也会溢出一个整数。如果你一开始就有更多的硬币,你会很快溢出


当整数溢出时,它显示为负值。根据下面的建议,这是未定义的行为。这是程序员使用的一个术语,新手不太理解

C标准第6.5p5节:

如果在评估过程中出现异常情况 表达式(即,如果结果不是数学定义的,或 不在其类型的可表示值范围内),行为 没有定义

这意味着任何大于
int_MAX
或小于
int_MIN
int
表达式都会导致问题。这些问题没有定义,所以你无法处理它们;最好避免这样的事情。在您的情况下,计算会如上文所述变成负值。然而,这不是必需的。也许如果你要在不同的系统上用不同的编译器编译和运行这个程序,你的程序可能会崩溃,或者看起来像预期的那样工作,在有限的存储空间中以某种方式表示一组无限的值,或者一只小鸡可能会无头运行几分钟。。。谁知道呢


您可以通过仔细选择范围更广的类型(如其他答案中所述)来避免此问题,并在输入上强制设置上限值,以避免溢出。另一种方法是使用任意精度的算术库,例如不应溢出的库。

s和d从何而来?它们的初始值是什么?发布
相关的
代码-所有最小值的定义和初始值在C#中没有
printf
。除非您自己编写了该方法,否则您也应该发布该代码。您可能会遇到整数溢出。C中没有Print,这依赖于C++中没有任何不包含32位数字的特性,<代码>无符号INT/COM>实际上会解决OP的问题,因为没有一个月超过31天;(但这是一个例外情况。)你错了;当表达式产生的数字太大而无法用其类型表示时,该行为是未定义的<代码>整数x=整数最大值+1”是未定义的行为。谈论“普通”的解决方案并不鼓励“可移植”的解决方案。@modifiable lvalue-你完全正确。但这并不意味着粗鲁的“这是UB”对新手来说是个好答案。一点也不好。因为它会让一个没有线索的人,被迫查找未定义的行为,并想知道它到底意味着什么。在这种情况下,整数溢出会将变量的内容吹走,从而得到垃圾。这就是UB的意思——用简单的语言来说:任何事情都可能发生。因此,正如他们所说,该计划“甚至没有错”。正如弦理论家所说。。。。。。。所以你明白为什么“当一个整数溢出时,它显示为负值”属于一个错误的答案,但你还是接受了它。在现实世界中,这种未定义的行为产生了饱和、信号抛出和包装(这就是您描述的行为)的影响。“一个好的答案”会包含误导性的信息吗?现在这比你的评论要好得多。你的评论相当于一句“这是UB”,所以要么接受要么放弃。继续这样回答:+1。我们有太多的简短、无用、傲慢,甚至恶劣的评论。所有这些都不会让任何人有任何进展。一点:完全正确与否是有区别的