我需要将 off_t 变量转换为 size_t 变量,并且我想检测是否可能发生溢出。在C.
我最初的尝试如下所示:
off_t fsize;
size_t len;
...
if(fsize >= 0 && fsize <= SIZE_MAX) {
len = (size_t)fsize;
} else {
abort();
}
Run Code Online (Sandbox Code Playgroud)
但是,编译器不喜欢我在有符号类型和无符号类型之间进行比较(fsize <= SIZE_MAX)。我也无法真正对 off_t 和 size_t 类型各自的大小做出假设。
我也无法真正对 off_t 和 size_t 类型各自的大小做出假设。
要比较其可比范围没有明确绑定的混合有符号类型,请强制转换为uintmax_t。
一旦代码知道有符号 fsize >= 0为真,转换为宽无符号类型uintmax_t肯定不会缩小fsize值并消除警告。
if (fsize >= 0 && (uintmax_t) fsize <= SIZE_MAX) {
Run Code Online (Sandbox Code Playgroud)
如果转换为uintmax_t不必要的宽,我希望编译器仍然会发出有效的代码。