整型的每一种都有无符号(unsigned)和有符号(signed)两种类型(float和double总是带符号的),在默认
情况下声明的整型变量都是有符号的类型(char有点特别),如果需声明无符号类型的话就需要在类型前加上
unsigned。无符号版本和有符号版本的区别就是无符号类型能保存2倍于有符号类型的正整数数据,比如16位系
统中一个int能存储的数据的范围为-32768~32767,而unsigned能存储的数据范围则是0~65535。由于在计算机
中,整数是以补码形式存放的。根据最高位的不同,如果是1,有符号数的话就是负数;如果是无符号数,则都解释
为正数。同时在相同位数的情况下,所能表达的整数范围变大。另外,unsigned若省略后一个关键字,大多数编
译器都会认为是unsigned int。
#include <stdio.h> int main() { unsigned int a = 6; int b = -20; printf("%x\n", a+b); printf("%u\n", a+b);
printf("%d\n", a+b); printf("%d\n", a+b > 0); return 0; }
输出如下:
fffffff2
4294967282
-14
1
首先复习一下printf的输出格式:
1、以无符号八进制形式输出整数。对长整型可以用"%lo"格式输出。
main() { int a = -1; printf("%d, %o", a, a); } 运行结果:-1,177777 程序解析:-1在内存单元中(以补码形式存放)为(1111111111111111)2,转换为八进制数为(177777)8
2、x格式:以无符号十六进制形式输出整数。对长整型可以用"%lx"格式输出。
3、u格式:以无符号十进制形式输出整数。对长整型可以用"%lu"格式输出。
然后分析一下输出结果:
c++中有这样一句话 if either operand is unsigned int, the other is converted to unsigned int.当然,这要求运算符两边的操作数都是在unsigned int的级别以及以下,所以计算a+b时,b首先被隐式转化为unsigned int类型,然后与a相加,最后的结果也是unsigned int。整数在计算机中补码表示,a为 0x 00 00 00 06,b为0x ff ff ff ec,所以a+b为0x ff ff ff f2,将0x ff ff ff f2按照有符号整数输出,就是-14,按照无符号整数输出,就是4294967282,而他本身是0x ff ff ff f2,当然比0大多啦。
继续看下面
#include <stdio.h> int main() { short a=-1; unsigned short b=a; printf("%d\n", sizeof(a+b)); //4
printf("%x\n", a+b); // fffe return 0; }
运算符+的两边的操作数的数据类型如果低于int型的话,会隐式转化为int型