以上这种表述是不准确的,正确的结论应为:
“当表达式中存在有符号类型和无符号类型时,默认情况下计算的结果将转化为无符号类型”
而对于计算过程而言,变量本身转化为有符号还是无符号数,都不会改变在计算机中存储的位状态。
参考如下代码:
而如果将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 中左侧的值需要表现为无符号类型,因此呈现为一个较大的正数。将+号改成乘号结果也一样。
因此,可信的结论应该是:
有符号数和无符号数相加时,结果的二进制表达式不受何种符号类型影响的,而计算结果的值取决于结果所需呈现的类型。
当有符号数和无符号数出现在同一个表达式中,默认状态下(如果不像上述代码那样作强制转换)表达式的值为将结果转化为无符号类型的值。