是有符号整数和无符号整数一对一映射?

时间:2013-05-13 23:28:40

标签: c encoding unsigned unsigned-long-long-int

我想将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的转换是不是一对一的映射?谢谢!

1 个答案:

答案 0 :(得分:1)

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

另一方面,无法保证int64_t存在。

uint64_tint64_t的转换会为int64_t范围之外的值产生实现定义的结果。结果几乎肯定是你可能期望的结果,只需重新解释表示,但不能保证。

所以在实践中,您很可能会在int64_tuint64_t之间进行转换。

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