1

我想将 ip-port 对作为搜索键,所以我有以下功能

    int64_t make_pair(u_int32_t ip, u_int16_t port)
    {
            u_int64_t ip_u64 = ip;
            ip_u64 = ip_u64 << 16;
            int64_t ip_port_pair = (int64_t)(ip_u64 + (u_int64_t)port);
            return ip_port_pair;
    }

实际上,我想将 u_int64_t 转换为 int64_t 因为无符号整数比较值不方便。但是恐怕从 u_int64_t 到 int64_t 的转换不是一对一的映射,然后会出现一些冲突或搜索错误。

所以我想问一下从 u_int64_t 到 int64_t 的转换是否不是一对一的映射?谢谢!

4

1 回答 1

1

C 标准保证int64_t使用没有填充位的二进制补码表示,因此它隐含地保证存在一对一的映射。(我相信最负的值仍然有可能成为陷阱表示,但这在实践中不太可能。与普通的有符号整数类型不同,这些intN_t类型不能使最负的值成为陷阱表示;所有 2 N可能的表示都是明确定义的并具有不同的价值。)

另一方面,不能保证int64_t存在。

uint64_tto的转换会为 .int64_t范围之外的值生成实现定义的结果int64_t。结果几乎可以肯定是您可能期望的结果,它是通过简单地重新解释表示产生的,但不能保证。

所以在实践中,你很可能会在 和 之间进行int64_t转换uint64_t

但你为什么需要?您说这是“因为无符号整数比较值不方便”。有什么不方便的?关系运算符对有符号和无符号类型都有很好的定义。

于 2013-05-13T23:36:14.880 回答