我想进入SIZE_MAXC89.
我想到了以下方法SIZE_MAX:
const size_t SIZE_MAX = -1;
Run Code Online (Sandbox Code Playgroud)
由于标准(§6.2.1.2ANSIC)说:
当有符号整数转换为具有相等或更大大小的无符号整数时,如果有符号整数的值为非负,则其值不变.否则:如果无符号整数的大小更大,则有符号整数首先被提升为与无符号整数对应的有符号整数; 通过向该值添加一个大于可以在无符号整数类型 28中表示的最大数字的值,将该值转换为无符号
脚注28:
在二进制补码表示中,如果无符号整数具有更大的大小,则除了用符号位的副本填充高位以外,位模式中没有实际的变化.
这似乎已经定义了行为,但我不太确定我是否正确理解了该段落的措辞.
请注意,这个问题明确是关于C89的,所以这不能回答我的问题,因为标准有不同的措辞.
如果这不起作用,我提出的另一种方式是:
size_t get_size_max() {
static size_t max = 0;
if (max == 0) {
max -= 1U;
}
return max;
}
Run Code Online (Sandbox Code Playgroud)
但我在标准中找不到任何关于无符号整数下溢的信息,所以我在这里瞎了.
你可以使用:
#ifndef SIZE_MAX
#define SIZE_MAX ((size_t)(-1))
#endif
Run Code Online (Sandbox Code Playgroud)
转换-1为无符号整数类型的行为在C11 6.3.1.3"转换 - 有符号和无符号整数"一节中定义.C89具有相同的定义,编号为3.2.1.2.事实上,您在问题中引用了ISO C90定义6.2.1.2(ANSI C89和ISO C90之间的区别在于这些部分的编号不同).
我不建议使用const变量,因为它们不能用于常量表达式.
注意:这不能用于C90预处理器算法,它只适用于不包含强制转换或单词的整数常量表达式,因此我们不能使用任何sizeof技巧.在这种情况下,您可能需要一个特定于系统的定义; 预处理器没有标准的方法来检测typedef.
| 归档时间: |
|
| 查看次数: |
1784 次 |
| 最近记录: |