zoukankan      html  css  js  c++  java
  • 当表达式中存在有符号类型和无符号类型时

    
    

    以上这种表述是不准确的,正确的结论应为:

    “当表达式中存在有符号类型和无符号类型时,默认情况下计算的结果将转化为无符号类型”

    而对于计算过程而言,变量本身转化为有符号还是无符号数,都不会改变在计算机中存储的位状态。

    参考如下代码:

    
    

    而如果将printf()函数中的打印类型换成u%即无符号10进制类型时:

     1 int i,j;
     2 unsigned int x,y,z;
     3 i = -5;
     4 z = 2;
     5 x = i+z; //unsigned result
     6 j = i+z; //signed result
     7 printf(" i=-5;\n  z=2;\n  x=i+z;\n  j=i+z;\n");
     8 printf("i+z=%u  \n",i+z);
     9 printf("x=%u  \n",x);
    10 printf("j=%u  \n",j);

    运行结果为:
          i=-5;
          z=2;
          x=i+z;
          j=i+z;
          i+z=4294967293
          x=4294967293
          j=4294967293

    其中,4294967293的16进制表示为0xfffffffd,即是-3的补码。
    从上述结果可知,无论是无符号数变成有符号数还是有符号数变成无符号数,其计算结果都是一样的,而结果的值是取决于打印的类型。

    以下代码:

    1 int i=-5;
    2 unsigned int z=2;
    3 if(i+z>2)
    4     printf("i+z>2  \n");
    5 else 
    6     printf("i+z<2  \n");

    打印结果为:
         i+z>2

    而以下代码:

    1 int i=-5;
    2 unsigned int z=2;
    3 if(((int)(i*z))>2)//强制转换了
    4    printf("i+z>2  \n");
    5 else
    6    printf("i+z<2  \n");

    打印结果为:
         i+z<2

    原因是在逻辑表达式判断中,i+z>2 中左侧的值需要表现为无符号类型,因此呈现为一个较大的正数。将+号改成乘号结果也一样。

    因此,可信的结论应该是:

    有符号数和无符号数相加时,结果的二进制表达式不受何种符号类型影响的,而计算结果的值取决于结果所需呈现的类型。

    有符号数和无符号数出现在同一个表达式中,默认状态下(如果不像上述代码那样作强制转换)表达式的值为将结果转化为无符号类型的值。




    懒惰不会让你一下子跌到 但会在不知不觉中减少你的收获; 勤奋也不会让你一夜成功 但会在不知不觉中积累你的成果 越努力,越幸运。
  • 相关阅读:
    【杂谈】SpringBoot为啥不用配置启动类
    【API知识】SpringBoot项目中@EnableXXX的原理
    【杂谈】再看生产-消费模式
    【杂谈】Hash表与平衡树
    【杂谈】如何对Redis进行原子操作
    【杂谈】从底层看锁的实现2
    【杂谈】从底层看锁的实现
    HashMap的简易解读
    定时任务、反射、注解
    值得收藏的js原型详解
  • 原文地址:https://www.cnblogs.com/Rainingday/p/5947485.html
Copyright © 2011-2022 走看看