我在一些C ++代码中看到了以下形式的关键字“unsigned”:
const int HASH_MASK = unsigned(-1) >> 1;
以后:
unsigned hash = HASH_SEED;
(取自斯坦福的CS106B / X阅读器 - 由Eric S. Roberts撰写 - 关于“字符串哈希码函数的实现”主题)。
有人可以告诉我这个关键字的意思是什么,我什么时候才能使用它?
谢谢!
答案 0 :(得分:1)
看看:https://stackoverflow.com/a/7176690/1758762
unsigned是一个修饰符,可以应用于任何整数类型(char, short,int,long等)但是它本身与unsigned相同 中间体
答案 1 :(得分:0)
这是unsigned int
的简短版本。从语法上讲,您可以在任何使用任何其他数据类型的地方使用它,例如float
或short
。
答案 2 :(得分:0)
无符号类型是不能代表负数的类型;只有零和正数。在C ++中,它们使用模运算; N
- 位类型的模数为2^N
。在弄乱位模式时(例如,在计算哈希码时),使用无符号而不是有符号类型是个好主意,因为C ++允许多个不同的负数表示,这可能导致可移植性问题。
unsigned
可用作任何整数类型的限定符(例如unsigned int
或unsigned 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 ++编译器将char
,signed char
和unsigned char
视为三种不同的类型,即使char
被编译为其他两种类型之一。