我在客户端和服务器之间有一个接口,客户端发送(1)无符号值,(2)一个标志,指示值是否有符号/无符号。然后,服务器将无符号值静态转换为适当的类型。
我后来发现这是实现定义的行为,我一直在阅读它,但我似乎无法找到一个完全安全的合适解决方案?我读过关于类型惩罚,指针转换和memcpy的内容。
只需使用联合类型工作吗?包含signed和unsigned int的UnionType,以及signed / unsigned标志。对于签名值,客户端设置联合的签名部分,服务器读取签名部分。对于未签名的部分也是如此。还是我完全误解了什么?
附带问题:在具体情况下,我如何知道这种情况下的具体行为,例如: PPC上的windriver diab?我对如何找到这样的文档感到有点迷失。
答案 0 :(得分:1)
转化unsigned
→int
只是形式上的问题。在实践中,所有现存平台都使用两个补码表示,其中unsigned
→int
与int
→unsigned
完全相反(正式定义明确) 。所以没有问题。
查看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反序列化(转换为另一个变量)并对它做一些事情。