我们已经习惯了 char、int 和 float 类型,但现在是时候将这些东西提升到一个新高度,看看类型领域里还有哪些其他的东西了!
到目前为止,我们一直将 int 视为有符号类型(signed type),也就是说它的值可以是负数或正数。但 C 语言中也有特定的无符号整数类型(unsigned integer types),它们只能存储正数。
这些类型前面都加上关键字 unsigned。
int a; // 有符号
signed int a; // 有符号
signed q; // 有符号,"int" 或 "signed int" 的简写,较少见
unsigned int b; // 无符号
unsigned c; // 无符号,"unsigned int" 的简写
为什么呢?你为什么会决定只想存储正数呢?
答案是:在无符号变量中可以表示比有符号变量更大的数。
那为什么会这样呢?
你可以把整数看成由一定数量的位(bits)表示。在我的电脑上,一个 int 由 64 位表示。
每一种由 1 或 0 组成的位排列代表一个数字。我们可以决定如何划分这些数字。
对于有符号数,我们大致使用一半的排列表示负数,另一半表示正数。
对于无符号数,我们使用所有排列来表示正数。
在我的电脑上,64 位的 int 使用二进制补码(two’s complement)来表示无符号数,整数范围的限制如下:
| 类型 | 最小值 | 最大值 |
|---|---|---|
| int | -9,223,372,036,854,775,808 | 9,223,372,036,854,775,807 |
| unsigned int | 0 | 18,446,744,073,709,551,615 |
注意,最大的无符号 unsigned int 大约是最大的有符号 int 的两倍。所以你可以获得更多的灵活性。
还记得 char 吗?也就是我们用来存储单个字符的类型?
char c = 'B';
printf("%c\\n", c); // 输出 "B"
我要告诉你一个震惊的事实:它实际上是一个整数。
char c = 'B';
// 把 %c 改成 %d:
printf("%d\\n", c); // 输出 66(!!)