如何安全地比较 ssize_t 与 int64_t?

问题描述 投票:0回答:3

我想安全地将

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 上,它们的大小完全相同

c++ comparison
3个回答
5
投票

不要让事情过于复杂化。

ssize_t
int64_t
都是有符号类型,因此通用类型是两者中较大的一个,这意味着转换是保值的。
总之,直接使用比较运算符将做正确的事情

您只需在混合有符号和无符号时要小心,无符号至少与

int
和有符号类型一样大。因为只有在这种情况下,转换为通用类型才不会对负值进行保值。
在这种情况下,C++20 可以帮助 intcmp


4
投票

在 C++20 中,你甚至不需要关心符号或操作数的大小,只需使用 intcmp 进行比较

if (std::cmp_equal(a, b)) {
  // ... read succeeded
} else{
  // ... partial or read failure
}

还有

std::in_range
可以检查值,无论类型和符号如何


-4
投票

大多数时候你没有

ssize_t
。当你做事时会阻止你做

int64_t a;
ssize_t b;
b = sizeof(ssize_t) == sizeof(int64_t) ? a : whatever_else;
© www.soinside.com 2019 - 2024. All rights reserved.