### C语言关键字浅析系列 ###

### ISO/ANSI C 关键字 ###

sign的本意是“标记,做记号”,ed后缀有一种完成时的感觉,这里表示的是有符号的

signed关键字是ISO/ANSI C90标准新增的,其常见于整数类型的符号规定处

 

signed的作业是:

声明有符号类型的整数类型。

 

1、signed的宿命

与signed对应的即unsigned,后者意为无符号

其实说signed很常见也不见得,因为我们常用的int、short和long,以及long long,默认情况下都是signed有符号的

所以相比起来unsigned的戏份可能比signed更多,signed在这里只是相当于刻意地去说明其后面的变量是有符号类型的

signed int a;         /* 通常这里带signed的变量定义都可以省略掉signed,因为signed本身就是默认的 */
signed short int b;
signed short c;
signed long int d;
signed long e;
signed long long f;

unsigned int g;       /* 写上signed后,上面的定义似乎在刻意地大声说“上面这些变量应该是有符号的” */
unsigned short h;     /* 但一般unsigned的戏份还是比signed多,signed关键字和auto关键字的宿命类似 */

2、signed和unsigned本身有什么区别呢?

这时候不得不提数据在计算机中的存储,即内存等存储设备实际是怎么存一个数的

例如用内存中的一个字节(1byte = 8bit),我们要用这8位表示一个二进制数(计算机中任何进制的数的物理存储上都是二进制形式)

我们可以选择用一位表示符号(0为正,1为负),剩余的部分表示数值,这样的取值范围为:-128 ~ 127(十进制)

如果我们不用符号位,默认数字为正数,将8位全部用作表示数值,其范围是:0 ~ 255(十进制)

从符号位的取舍上看,signed就是带符号位的那种存储方式,unsigned就是不带符号位的那种存储方式,且unsigned只表示非负数

 

3、为什么一定要区分signed和unsigned?

看两种情况:signed和unsigned分别存储正数和负数,默认最高位为符号位

(1)正数6,分别用signed和unsigned方式在一个字节中存储:0000 0110 [signed]   0000 0110 [unsigned]

(2)int类型的负数-5和正数4294967291在4个字节中的存储:FFFF FFFB [十六进制]

上述例子有一个特点,就是不同变量在内存中的存储形式是一样的

由于0表示正,所以signed和unsigned的正数在内存中的表示是一样的

而同样的一个存储,在signed和unsigned下就可能表示两个不同的数(0除外)

所以unsigned类型的数一般要在输入和输出的时候刻意去注意