在这种情况下如何使用负零?

时间:2010-10-07 17:12:23

标签: c networking

struct in_addr ipv4;

ipv4.s_addr = (uint32_t)(-0)

3 个答案:

答案 0 :(得分:6)

这很奇怪,通常算术是通过Two's Complement实现的,所以你不能有效地表达0

One's Complement 版本中,否定0存储为0xFFFFFFFF,因此在转换为转换为ipv4地址后,您将拥有255.255.255.255 unsigned int。

在使用-0将其转换为unsigned int的普通架构中,应该只给你0x00000000

答案 1 :(得分:1)

这没有太大意义,因为标准说明了确切的宽度整数类型

  

这些类型是可选的。但是,如果   实现提供整数   宽度为8,16,32或64的类型   位,没有填充位,和(对于   签名类型)有两个   补充表示,它应该   定义相应的typedef   名。

首先,对于任何这些签名类型,没有负零,对于无符号类型,则更少。在任何情况下,您展示的简单0任务都会很好,或UINT32_C(0)如果您想挑剔。

答案 2 :(得分:0)

它将用于获取无符号整数的有符号值,或者比有符号整数的最大值多一个。

uint32_t将它转换为无符号整数,而-0将强制它为负数,翻转有符号位,并返回无符号值并翻转它。

This article解释了有符号的整数。