我在一些 C++ 代码中看到了以下形式的关键字“unsigned”:
const int HASH_MASK = unsigned(-1) >> 1;
然后:
unsigned hash = HASH_SEED;
(取自 Eric S. Roberts 的斯坦福大学 CS106B/X 阅读器,主题为“字符串哈希码函数的实现”)。
有人可以告诉我这个关键字是什么意思,我什么时候使用它?
谢谢!
看看:https ://stackoverflow.com/a/7176690/1758762
unsigned 是一个修饰符,可以应用于任何整数类型(char、short、int、long 等),但它本身与 unsigned int 相同。
这是一个简短的版本unsigned int
。从语法上讲,您可以在任何使用其他数据类型(如float
or )的地方使用它short
。
无符号类型是不能表示负数的类型;只有零和正数。在 C++ 中,它们使用模运算;N
位类型的模数是2^N
。在处理位模式时(例如,在计算哈希码时)使用无符号类型而不是有符号类型是一个好主意,因为 C++ 允许负数的几种不同表示形式,这可能会导致可移植性问题。
unsigned
可以用作任何整数类型的限定符(例如unsigned int
or unsigned long long
);或单独作为unsigned int
.
所以第一个转换-1
为unsigned int
. 由于模运算,这给出了最大的可表示值。这也可以写成(在我看来更清楚)std::numeric_limits<unsigned>::max()
。
第二个声明并初始化一个类型为 的变量unsigned int
。
默认情况下,值是有符号的,这意味着它们可以是正数或负数。unsigned 关键字用于指定一个值必须是正数。
有符号变量使用 1 位来指定值是否为正。unsigned 关键字实际上使该位成为值的一部分(因此允许存储更大的数字)。
最后,unsigned hash
编译器将其解释为unsigned int hash
(int 是 C 编程中的默认类型)。
要了解无符号的含义,必须了解有符号和无符号整数。有关二元恭维的完整解释,请搜索 Wikipedia,但简而言之,计算机通过从 2^32(对于 32 位整数)中减去负数来存储负数。这样,-1 存储为 2^32-1。这确实意味着您只有 2^31 个正数,但那是按顺序排列的。这被称为有符号整数(因为它可以有正号或负号)
Unsigned 告诉编译器你不想要二进制恭维并且只处理正数。当 -1 被类型转换(如代码中所示)为无符号整数时,它变为
2^32-1 = 0b111111111...
因此,这是在二进制中获得大量 1 的一种简单方法。
很少使用无符号。如果您需要进行位操作,或者由于某种原因只需要大于 2^31 的正整数。否则,如果你忽略它,c++ 会假定有符号整数。
C 允许char
s 有符号或无符号,这取决于哪个对主机更有效。如果你想确保你char
的变量是无符号的,你可以将你的变量声明为unsigned char
. signed char
如果您想要确保签名的解释,您可以使用。
顺便说一句,C 和 C++ 编译器将char
、signed char
和unsigned char
视为三种不同的类型,即使char
被编译为其他两种类型之一。