新手有关隐式类转换规则问题,求助,谢谢~
看了下隐式类转换规则
7.否则,两个操作数都转换为带符号整数类型对应的无符号整数类型。
我定义了一个int,一个unsigned int然后两者运算,按照这个说法最后结果类型应该是unsigned int类型。
下面一段小程序实际输出是-10000,那就是说两者运算结果转换为了int类型了而不是unsigned int类型,与规则矛盾按照规则应该是错误输入。
不知道是不是这样,新手求助啊~
[解决办法]
因为你是%d输出的, 而%d表示的是有符号整数的输出. 无符号数输出应该用%u.
b = a+b;
这句就已经把计算结构强行转换成无符号数了.
[解决办法]
%d又把b cast成signed了。
[解决办法]
非也非也,楼主只知其一,不知其二.
首先自动类型转换的规则为:
按照从高到低的顺序给各种数据类型分等级,依次为:long double, double, float, unsigned long long, long long, unsigned long, long, unsigned int 和 int。这里有一个小小的例外,如果 long 和 int 大小相同,则 unsigned int 的等级应位于 long 之上。char 和 short 并没有出现于这个等级列表,是因为它们参与运算时就应该已经被升级成了 int 或者 unsigned int。
由此得知: a+b 是要先把 a 当成unsigned int 来看待的. 可知a+b的结果是55536
然后:
在赋值语句中,= 右边的值在赋予 = 左边的变量之前,首先要将右边的值的数据类型转换成左边变量的类型。也就是说,左边变量是什么数据类型,右边的值就要转换成什么数据类型的值。这个过程可能导致右边的值的类型升级,也可能导致其类型降级(demotion)。所谓“降级”,是指等级较高的类型被转换成等级较低的类型。
然后55536转化成int时,就变成-10000了