"无符号"关键字

The "unsigned" keyword

本文关键字:关键字 无符号      更新时间:2023-10-16

我在一些c++代码中看到关键字"unsigned"的形式如下:

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

,后来:

unsigned hash = HASH_SEED;

(摘自斯坦福大学CS106B/X读物-由Eric S. Roberts -关于"字符串的哈希码函数的实现"的主题)

谁能告诉我这个关键词是什么意思,我什么时候用它?

谢谢!

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

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

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

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

unsigned可以用作任何整数类型的限定符(例如unsigned intunsigned long long);或者作为unsigned int的简写。

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

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

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

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

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

为了更好地理解unsigned是什么意思,我们必须理解有符号整数和无符号整数。想要了解two -compliment的完整解释,请搜索维基百科,但简而言之,计算机通过2^32减去负数来存储负数(对于32位整数)。这样,-1被存储为2^32-1。这确实意味着只有2^31个正数,但这是顺便说一下。这被称为带符号整数(因为它可以有正号或负号)

Unsigned告诉编译器你不想要两个互补,只处理正数。当-1被类型转换为unsigned int时,它变成

2^32-1 = 0b111111111...

因此,这是一种简单的方法,可以在二进制中得到一大堆1。

很少使用unsigned。如果你需要做位运算,或者出于某种原因只需要大于2^31的正整数。否则,如果省略它,c++将假定为有符号整数。

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

顺便说一下,C和c++编译器将charsigned charunsigned char视为三种不同的类型,尽管char被编译为另外两种类型之一。