"无符号"关键字
The "unsigned" keyword
我在一些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
的简短版本。从语法上讲,您可以在任何其他数据类型(如float
或short
)的地方使用它。
Unsigned类型是不能表示负数的类型;只有零和正数。在c++中,它们使用模运算;N
位类型的模数为2^N
。在处理位模式时(例如,计算哈希码时),使用无符号而不是有符号类型是一个好主意,因为c++允许几种不同的负数表示,这可能导致可移植性问题。
unsigned
可以用作任何整数类型的限定符(例如unsigned int
或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编程中的默认类型)。
为了更好地理解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++编译器将char
、signed char
和unsigned char
视为三种不同的类型,尽管char
被编译为另外两种类型之一。
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 将无符号char*转换为std::istream*C++
- 如何在C++中将一个无符号的 int 转换为两个无符号的短裤?
- 从矢量<无符号字符>转换为字符* 包括垃圾数据
- 如何理解将半精度指针转换为无符号长指针和相关的内存对齐
- C++中无符号字符溢出
- 使用无符号字符数组有效存储内存
- 如何打印boost多精度128位无符号整数
- C++模板函数,用于比较任何无符号整数和有符号整数
- 在 std::无符号字符的向量处存储 int 的十六进制表示形式
- 获取隐式转换溢出从无符号到已签名的警告
- 如何在保持其值的同时将 c++ 无符号字符变量转换为 char 变量
- 从 std::vector<无符号字符>切片中提取 int?
- 是什么导致了这种使用三进制而不是短整型的有符号int到无符号int转换
- 无法在 Arduino 中uint8_t数组转换为无符号长整型数组
- 将无符号字符的向量存储在数组中会给我 std::bad_alloc
- 使用 fopen 打开 .pak 文件并使该文件应用于 const 无符号字符* (C++)
- C4018:类内有符号、无符号不匹配
- 以三个无符号字符为关键字的无序映射
- "无符号"关键字