整型的每一种都有无符号(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型