"未签名"关键词

时间:2013-05-15 14:49:02

标签: c++ unsigned

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

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

以后:

unsigned hash = HASH_SEED;

(取自斯坦福的CS106B / X阅读器 - 由Eric S. Roberts撰写 - 关于“字符串哈希码函数的实现”主题)。

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

谢谢!

6 个答案:

答案 0 :(得分:1)

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

  

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

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

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

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

答案 3 :(得分:0)

默认情况下会对值进行签名,这意味着它们可以是正数或负数。 unsigned关键字用于指定值必须为正。

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

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

答案 4 :(得分:0)

要想知道无符号意味着什么,就必须理解有符号和无符号整数。有关二重恭维的完整解释,请搜索维基百科,但简而言之,计算机通过从2 ^ 32减去负数(对于32位整数)来存储负数。以这种方式,-1被存储为2 ^ 32-1。这意味着你只有2 ^ 31个正数,但这是由。这称为有符号整数(因为它可以有正号或负号)

Unsigned告诉编译器你不想要两个赞美并且只处理正数。当-1是类型转换(在代码中)到 unsigned int 时,它变为

2^32-1 = 0b111111111...

因此,这是以二进制形式获得大量1的简单方法。

很少使用unsigned。如果你需要进行位操作,或者由于某种原因只需要大于2 ^ 31的正整数。否则,如果将其遗漏,c ++将采用有符号整数。

答案 5 :(得分:0)

C允许char签名或取消签名,具体取决于哪个对主机更有效。如果您想确保char未签名,则可以将变量声明为unsigned char。如果您需要确保签名解释,可以使用signed char

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