【问题标题】:Why does my program repeat forever instead of giving the maximum integer value? [closed]为什么我的程序永远重复而不是给出最大整数值? [关闭]
【发布时间】:2018-06-27 01:24:31
【问题描述】:

我目前正在学习 C,并且我编写了一个程序,我认为它会给我最大的整数值,但它只是永远循环。我找不到关于为什么它不会结束的答案。

#include <stdio.h>

int main()
{
    unsigned int i = 0;
    signed int j = i;
    for(; i+1 == ++j; i++);
    printf(i);
    return 0;
}

任何帮助将不胜感激,谢谢!

【问题讨论】:

  • 这段代码无法编译,printf 不正确。您的编译器中是否打开了警告?这不是完全相同的副本,但它应该可以帮助您了解正在发生的事情。 stackoverflow.com/questions/17293749/…
  • 您遇到无符号整数溢出。当我再次从零开始时,输出应该提示有什么事情发生了。
  • 什么会终止使用i = 1, j = 0 并测试i == ++j 然后递增i 并再次进行相同测试的循环? (例如1 == 12 == 2 等。)
  • 您还遇到了有符号整数溢出runtime error: signed integer overflow: 2147483647 + 1 cannot be represented in type 'int',这使得整个程序的行为未定义。您认为您如何完全推断出最大整数值?

标签: c integer unsigned signed


【解决方案1】:

您的代码具有未定义的行为。这不是因为unsigned 整数溢出(当值太大时它会换行)。 signed 整数溢出是未定义的行为。

另外请注意,如果您想知道int 可以容纳的最大值,请使用宏INT_MAX

 maximum value for an object of type int
 INT_MAX                                +32767 // 215 - 1

你应该正确地写printf。 (传递格式说明符,然后传递格式说明符指定的其他参数)。

【讨论】:

  • 有符号到无符号的转换没有明确定义吗?有符号的值被转换为无符号的比较,但它是否也用于预增量?
  • @RetiredNinja.: 相比之下是 - 在预增量中没有。
【解决方案2】:

我以为会给我最大的整数值

最大的signed int 值不能通过实验便携式找到,而不会冒未定义行为 (UB) 的风险。在 OP 的代码中,最终++j 溢出(UB)。 UB 包括 永远循环

由于@coderredoc 的回答很好,请改用printf("%d\n", INT_MAX);


求最大unsigned value

printf("%u\n", UINT_MAX);
// or 
unsigned maxu = -1u;
printf("%u\n", maxu);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-26
    • 2022-11-12
    相关资源
    最近更新 更多