繁体   English   中英

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

[英]Converting between unsigned and signed int safely

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

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

会简单地使用联合类型吗? 一个包含有符号和无符号int以及有符号/无符号标志的UnionType。 对于带符号的值,客户端设置联合的带符号的部分,服务器读取带签名的部分。 相同的未签名部分。 还是我完全误会了什么?

附带问题:如何得知特定情况下的特定行为,例如PPC上的windriver diab? 我对如何找到这样的文档有些迷惑。

转换unsignedint只是形式上有问题。 实际上,所有现存平台都使用二进制补码表示形式,其中unsignedintintunsigned (在形式上明确定义)完全相反。 因此没有问题。


参阅Wikipedia在UNIVAC上的文章,以一个使用补码表示的平台为例,例如12位和36位位字。

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

您应该以某种方式序列化值。 但是,您只需针对每种类型分别执行此操作。

例如(伪代码)

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进行反序列化,以此类推。 如果它是“ u”,则您将未签名的int序列化(转换为其他变量)并对其进行处理。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM