我想将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的转换是不是一对一的映射?谢谢!
答案 0 :(得分:1)
C标准保证int64_t
使用二进制补码表示而没有填充位,因此隐含地保证存在一对一映射。 (我认为最负面值仍然可能是陷阱表示,但这在实践中不太可能。与普通的有符号整数类型不同,intN_t
类型不能产生最大负值a陷阱表示;所有2个 N 可能的表示都是明确定义的并且具有不同的值。)
另一方面,无法保证int64_t
存在。
从uint64_t
到int64_t
的转换会为int64_t
范围之外的值产生实现定义的结果。结果几乎肯定是你可能期望的结果,只需重新解释表示,但不能保证。
所以在实践中,您很可能会在int64_t
和uint64_t
之间进行转换。
但你为什么需要?你说它是“因为无符号整数比较值不方便”。它有什么不方便的?关系运算符已为有符号和无符号类型定义良好。