无符号负原语?

时间:2010-06-12 16:56:41

标签: c++ unsigned primitive negative-number

在C ++中,我们可以创建基元unsigned。但他们总是积极的。还有办法制作无符号负变量吗?我知道无符号这个词的意思是“没有符号”,所以也不是减号( - )。但我认为C ++必须提供它。

5 个答案:

答案 0 :(得分:4)

没有。 unsigned只能包含非负数。

如果您需要一种仅代表负数的类型,您需要自己编写一个类,或者只是在程序中将该值解释为负数。

(但为什么你需要这样的类型?)

答案 1 :(得分:2)

unsigned整数只是正数。从2003年C ++标准的3.9.1第3段开始:

  

a的非负值范围   有符号整数类型是一个子范围   相应的无符号整数   类型和值的表示   每个对应的签名/未签名   类型应相同。

无符号整数类型的主要目的是支持模运算。从3.9.1第4段开始:

  

无符号整数,声明未签名,   应遵守算术规律   modulo 2 n 其中n是   值中的位数   表示该特定大小   整数。

当然,如果你愿意的话,你可以自由地将它们视为否定,你只需要以某种方式跟踪它(可能带有布尔标志)。

答案 2 :(得分:0)

我认为你认为这是错误的方式。

如果您想要一个负数,那么您不能将该变量声明为无符号。

如果你的问题是值范围,并且你想要那个位,那么你可以使用“更大”的数据类型(例如int 64)。

然后,如果您正在使用遗留代码,创建一个新结构可以解决您的问题,但这是因为您的具体情况,C ++不应该处理它。

答案 3 :(得分:0)

不要被这个名字所迷惑:unsigned通常被误解为非负面的,但是语言的规则是不同的......可能更好的名称是“bitmask”或“modulo_integer”。

如果您认为无符号是非负的,那么例如隐式转换规则是完全无意义的(为什么两个非负数之间的差异应该是非负的?为什么添加非负数和整数应该是非负面的?)。

非常不幸的是,C ++标准库本身陷入了这种误解,因为例如vector.size()是无符号的(如果你的意思是语言本身在位掩码或modulo_integer方面的意义,则是荒谬的)。对于大小的这种选择更多地与旧的16位时间相比,而不是与无符号相关,并且在我看来,这是一个可怕的选择,我们仍然作为错误付出。

答案 4 :(得分:0)

  

但我认为C ++必须提供它。

为什么呢?您认为C ++必须提供使非负数为负数的能力吗?那太傻了。

C ++中的无符号值定义为始终为非负值。他们甚至在零处缠绕 - 而不是下溢! (在范围的另一端也是如此)