我想安全地将
ssize_t
变量与 int64_t
变量进行比较,以检查值是否相等。我所说的安全是指比较应该适用于任何 ssize_t
值。我的第一个猜测是使用 static_cast
将 ssize_t
转换为 int64_t
但我不确定这是否是一种安全的转换方法?
类似:
ssize_t a = read(...);
int64_t b = getsize(...);
if(static_cast<int64_t>(a) == b){
// ... read succeeded
} else{
// ... partial or read failure
}
更新:在 Ubuntu 上,它们的大小完全相同
不要让事情过于复杂化。
ssize_t
和 int64_t
都是有符号类型,因此通用类型是两者中较大的一个,这意味着转换是保值的。您只需在混合有符号和无符号时要小心,无符号至少与
int
和有符号类型一样大。因为只有在这种情况下,转换为通用类型才不会对负值进行保值。在 C++20 中,你甚至不需要关心符号或操作数的大小,只需使用 intcmp 进行比较
if (std::cmp_equal(a, b)) {
// ... read succeeded
} else{
// ... partial or read failure
}
std::in_range
可以检查值,无论类型和符号如何
大多数时候你没有
ssize_t
。当你做事时会阻止你做
int64_t a;
ssize_t b;
b = sizeof(ssize_t) == sizeof(int64_t) ? a : whatever_else;