有可行的方法来定义INT_MAX吗?

Hat*_*ick 8 c int gcc

我在/usr/include/limits.h中找到了以下定义:

# define INT_MIN (-INT_MAX - 1)

# define INT_MAX 2147483647

此外,似乎此头文件中的所有XXX_MAX都是从数字常量中明确定义的.

我想知道是否有一种可移植的方式(跨平台的不同字大小)来定义INT_MAX?

我尝试了以下方法:

~((int)-1)

但这似乎不正确.

一个简短的解释也受到高度重视.

R..*_*R.. 9

对于INT_MAX标准头文件limits.h,实现者的手由于需要在预处理器#if指令中使用它而受到限制.这排除了涉及sizeof或演员的任何事情.

如果你只想要一个在实际C表达式中工作的版本,也许这会起作用:

(int)-1U/2 == (int)(-1U/2) ? (int)-1U : (int)(-1U/2)
Run Code Online (Sandbox Code Playgroud)

这里的概念是int可以具有相同数量的值位unsigned,或者一个更少的值位; C标准允许.为了测试它是什么,检查转换结果(int)-1U.如果-1U适合int,其值必须由强制转换保持不变,因此相等性将为真.如果-1U不适合int,则转换将生成类型的实现定义结果int.然而,无论价值是什么,仅仅通过可能值的范围,平等将是错误的.

请注意,从技术上讲,转换int可能会导致实现定义的信号被提升,而不是获得实现定义的值,但是当您处理将在以下计算的常量表达式时,这不会发生.编译时间.

  • 我没有看到 C 标准排除无符号类型比相应的有符号类型多 1 个以上的值位,在这种情况下,`(int)-1U/2` 和 `(int)(-1U/2 )` 可能导致实现定义的值,可能是相同的值。 (2认同)