怎么可能比 (unsigned long long) > LONG_MAX 大?

fab*_*ous 5 c

我在需要更新的算法中找到了这段代码:

 if (value > (unsigned long long) LONG_MAX)
Run Code Online (Sandbox Code Playgroud)

编辑:value是两个uint64_t数字相除的结果。

我知道这(unsigned long long) LONG_MAX是一个非常大的数字:

   #include "stdio.h"
   #include "limits.h"

   int main() {
     unsigned long long ull = (unsigned long long) LONG_MAX;
     printf("%lu",ull);
     return 0;
   }
Run Code Online (Sandbox Code Playgroud)

印刷 9223372036854775807

那么我在这里比较的是什么?在什么情况下,此if语句将评估为true

dbu*_*ush 5

A floatordouble可以比那个大。C 标准的附录 Ep5规定,任何一种类型都必须能够保存至少与1E37大于等于LONG_MAX2147483647 的值一样大的值:

以下列表中给出的值应替换为具有大于或等于所示值的实现定义的常量表达式:

#define DBL_MAX 1E+37
#define FLT_MAX 1E+37
#define LDBL_MAX 1E+37
Run Code Online (Sandbox Code Playgroud)

因此,如果value是这两种类型中的任何一种,它都可以评估为真。

编辑:

由于value是 a uint64_t,其最大值为 18446744073709551615,因此这也可以大于LONG_MAX


Joh*_*ger 4

怎么可能比 (unsigned long long) > LONG_MAX 更大?

容易地。 LONG MAX是可以表示为 a 的最大值long int。将其转换为unsigned long long不会更改其,只会更改其数据类型unsigned long int在您可能遇到的每个 C 实现中,可以表示为 an 的最大值都更大。在某些情况下,的最大值更大,并且在您可能遇到的每个 C 实现中,long long int的最大值也更大(在某些情况下更大)。unsigned long long int

然而,这...

     unsigned long long ull = (unsigned long long) LONG_MAX;
     printf("%lu",ull);
Run Code Online (Sandbox Code Playgroud)

...不是调查相关值的一致方法,因为%lu是 type 的格式化指令unsigned long,而不是unsigned long long. 因此,所提出的调用printf具有未定义的行为。

我在需要更新的算法中找到了这段代码:

 if (value > (unsigned long long) LONG_MAX)
Run Code Online (Sandbox Code Playgroud)

编辑:值是两个 uint64_t 数字相除的结果。

[...]

在什么情况下这个 if 语句的计算结果为 true?

假设value具有 type uint64_t,这可能与您的实现中的相同,则至少在设置了最高有效位时,unsigned long long该语句中的条件if将评估为 true 。但是,如果您的宽度仅为 32 位,则条件评估结果为 true 的范围将比该范围大得多,因为有许多 64 位整数大于可表示为有符号 32 位整数的最大值。valuelong int

我倾向于猜测代码确实是在long int32 位宽的假设下编写的,因此该if语句提出了一个非常自然的问题:“之前uint64_t除法的结果可以表示为 along吗?” 事实上,这就是该语句在任何情况下所评估的内容,但如果只有 32 位宽,if则更有意义,这是 32 位计算机的典型情况,也是 32 位和 64 位 Windows 上的标准。long