zoukankan      html  css  js  c++  java
  • 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; }

    输出如下:

    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型

  • 相关阅读:
    SqlServer 利用临时表批量添加&&修改数据库表中的数据
    有关Linux的实时性
    烟囱式到SOA再到微服务
    消费金融前世今生
    其它 一加7t禁止系统更新
    电商 相关底层知识
    CRMEB 基础 列表拖动排序2
    CRMEB 基础 列表拖动排序1
    前端 table排序
    MacBook 关闭访客登陆
  • 原文地址:https://www.cnblogs.com/zzj2/p/3019298.html
Copyright © 2011-2022 走看看