在 C++ 中,我们可以制作原语unsigned
。但他们总是积极的。还有没有办法制作无符号负变量?我知道 unsigned 这个词的意思是“没有符号”,所以也不是减号 (-)。但我认为 C++ 必须提供它。
5 回答
No.unsigned
只能包含非负数。
如果你需要一个只表示负数的类型,你需要自己写一个类,或者只是在你的程序中将值解释为负数。
(但为什么需要这种类型?)
unsigned
整数只有正数。从 2003 C++ 标准的 3.9.1 第 3 段开始:
有符号整数类型的非负值范围是对应无符号整数类型的子范围,每个对应的有符号/无符号类型的值表示应相同。
无符号整数类型的主要目的是支持模运算。从 3.9.1 第 4 段开始:
声明为无符号的无符号整数应遵守算术模 2 n的定律,其中 n 是该特定大小的整数的值表示中的位数。
当然,如果您愿意,您可以自由地将它们视为消极的,您只需要以某种方式自己跟踪它(可能使用布尔标志)。
不要被这个名字所迷惑:unsigned 经常被误解为非负数,但是语言的规则是不同的......可能更好的名字应该是“bitmask”或“modulo_integer”。
如果您认为 unsigned 是非负的,那么例如隐式转换规则完全是胡说八道(为什么两个非负数之间的差异应该是非负数?为什么非负数和整数的加法应该是非负数?)。
非常不幸的是,C++ 标准库本身陷入了这种误解,因为例如 vector.size() 是无符号的(如果你的意思是像语言本身在位掩码或模整数方面所做的那样是荒谬的)。这种大小选择更多地与旧的 16 位时间有关,而不是与无符号时间有关,在我看来,这是一个糟糕的选择,我们仍然以错误的形式付费。
我认为你的想法是错误的。
如果你想要一个负数,那么你不能将变量声明为无符号的。
如果您的问题是值范围,并且您想要多一点,那么您可以使用“更大”的数据类型(例如 int 64 ...)。
然后,如果您使用的是遗留代码,则创建一个新结构可以解决您的问题,但是由于您的具体情况,C++ 不应该处理它。
但我认为 C++ 必须提供它。
为什么?你认为 C++ 必须提供使非负数为负的能力吗?这很愚蠢。
C++ 中的无符号值被定义为始终为非负数。他们甚至在零处环绕——而不是下溢!(在范围的另一端也是如此)