在C ++中,我们可以创建基元unsigned
。但他们总是积极的。还有办法制作无符号负变量吗?我知道无符号这个词的意思是“没有符号”,所以也不是减号( - )。但我认为C ++必须提供它。
答案 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 ++中的无符号值定义为始终为非负值。他们甚至在零处缠绕 - 而不是下溢! (在范围的另一端也是如此)