1

我在一些 C++ 代码中看到了以下形式的关键字“unsigned”:

const int HASH_MASK = unsigned(-1) >> 1;

然后:

unsigned hash = HASH_SEED;

(取自 Eric S. Roberts 的斯坦福大学 CS106B/X 阅读器,主题为“字符串哈希码函数的实现”)。

有人可以告诉我这个关键字是什么意思,我什么时候使用它?

谢谢!

4

6 回答 6

1

看看:https ://stackoverflow.com/a/7176690/1758762

unsigned 是一个修饰符,可以应用于任何整数类型(char、short、int、long 等),但它本身与 unsigned int 相同。

于 2013-05-15T14:54:00.227 回答
0

这是一个简短的版本unsigned int。从语法上讲,您可以在任何使用其他数据类型(如floator )的地方使用它short

于 2013-05-15T14:52:48.507 回答
0

无符号类型是不能表示负数的类型;只有零和正数。在 C++ 中,它们使用模运算;N位类型的模数是2^N。在处理位模式时(例如,在计算哈希码时)使用无符号类型而不是有符号类型是一个好主意,因为 C++ 允许负数的几种不同表示形式,这可能会导致可移植性问题。

unsigned可以用作任何整数类型的限定符(例如unsigned intor unsigned long long);或单独作为unsigned int.

所以第一个转换-1unsigned int. 由于模运算,这给出了最大的可表示值。这也可以写成(在我看来更清楚)std::numeric_limits<unsigned>::max()

第二个声明并初始化一个类型为 的变量unsigned int

于 2013-05-15T14:54:19.410 回答
0

默认情况下,值是有符号的,这意味着它们可以是正数或负数。unsigned 关键字用于指定一个值必须是正数。

有符号变量使用 1 位来指定值是否为正。unsigned 关键字实际上使该位成为值的一部分(因此允许存储更大的数字)。

最后,unsigned hash编译器将其解释为unsigned int hash(int 是 C 编程中的默认类型)。

于 2013-05-15T14:54:30.410 回答
0

要了解无符号的含义,必须了解有符号和无符号整数。有关二元恭维的完整解释,请搜索 Wikipedia,但简而言之,计算机通过从 2^32(对于 32 位整数)中减去负数来存储负数。这样,-1 存储为 2^32-1。这确实意味着您只有 2^31 个正数,但那是按顺序排列的。这被称为有符号整数(因为它可以有正号或负号)

Unsigned 告诉编译器你不想要二进制恭维并且只处理正数。当 -1 被类型转换(如代码中所示)为无符号整数时,它变为

2^32-1 = 0b111111111...

因此,这是在二进制中获得大量 1 的一种简单方法。

很少使用无符号。如果您需要进行位操作,或者由于某种原因只需要大于 2^31 的正整数。否则,如果你忽略它,c++ 会假定有符号整数。

于 2013-05-15T14:54:31.760 回答
0

C 允许chars 有符号或无符号,这取决于哪个对主机更有效。如果你想确保你char的变量是无符号的,你可以将你的变量声明为unsigned char. signed char如果您想要确保签名的解释,您可以使用。

顺便说一句,C 和 C++ 编译器将charsigned charunsigned char视为三种不同的类型,即使char被编译为其他两种类型之一。

于 2013-05-15T15:09:48.813 回答