unsigned && signed

整型的每一种都有无符号(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;
}输出如下:fffffff24294967282-141

首先复习一下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型

原文链接: https://www.cnblogs.com/zzj2/archive/2013/04/13/3019298.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/84474

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月9日 下午9:35
下一篇 2023年2月9日 下午9:35

相关推荐