安全地在unsigned和signed int之间进行转换

时间:2014-06-13 05:08:58

标签: c++ types casting int unsigned

我在客户端和服务器之间有一个接口,客户端发送(1)无符号值,(2)一个标志,指示值是否有符号/无符号。然后,服务器将无符号值静态转换为适当的类型。

我后来发现这是实现定义的行为,我一直在阅读它,但我似乎无法找到一个完全安全的合适解决方案?我读过关于类型惩罚,指针转换和memcpy的内容。

只需使用联合类型工作吗?包含signed和unsigned int的UnionType,以及signed / unsigned标志。对于签名值,客户端设置联合的签名部分,服务器读取签名部分。对于未签名的部分也是如此。还是我完全误解了什么?

附带问题:在具体情况下,我如何知道这种情况下的具体行为,例如: PPC上的windriver diab?我对如何找到这样的文档感到有点迷失。

2 个答案:

答案 0 :(得分:1)

转化unsignedint只是形式上的问题。在实践中,所有现存平台都使用两个补码表示,其中unsignedintintunsigned完全相反(正式定义明确) 。所以没有问题。


查看Wikipedia’s article on the UNIVAC的平台示例,其中使用了一个补码表示,例如对于12位和36位位字。

答案 1 :(得分:0)

联合解决方案将要求您让客户端和服务器都使用相同的表示,这不是一个好主意。 (例如big-endian和little-endian系统都很常见)。

您应该以某种方式序列化该值。但是你只需为每种类型单独执行此操作。

例如(伪代码)

void send_signed(int32_t x)
{
    send(1, "s");
    send(sizeof x, serialized x);
}

void send_unsigned(uint32_t x)
{
     send(1, "u");
     send(sizeof x, serialized x);
}

在接收器上;你先读了这个类型。如果它是“s”,那么你将一个带符号的int反序列化,以及它的某些东西;如果它是“你”,那么你将unsigned int反序列化(转换为另一个变量)并对它做一些事情。