### 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类型的数一般要在输入和输出的时候刻意去注意