我想通过一个套接字传递一个32位有符号整数x
。为了让接收器知道哪个字节顺序,我在发送之前调用htonl(x)
。 htonl
预计会有uint32_t
,但我想确定在将我的int32_t
投射到uint32_t
时会发生什么情况。在signed和unsigned int之间是否保持精确的位模式?
int32_t x = something;
uint32_t u = (uint32_t) x;
是否总是在x
和u
每个字节会完全一样的情况下?怎么样铸造回:
uint32_t u = something;
int32_t x = (int32_t) u;
我认识到,投大无符号值的负值,但这并不重要,因为我只是铸造回到另一端。但是如果使用实际字节进行强制转换,那么我无法确定强制转换会返回相同的值。
不错,+1与工会的解决方案。 –
太棒了,这是我想知道的。因此,它将始终工作提供签名ints使用二进制补码来表示,这几乎总是如此。那是对的吗? – Flash
@Andrew:正确 - 甚至在非二进制补码硬件上,编译器将不得不伪装成固定宽度的整数类型,或者根本不提供它们;在溢出时产生一个信号在实践中也不会成为问题 – Christoph