unsigned 和 signed 混合运算总结
unsigned 和 signed 混合运算总是被问及,我这里总结一下。这里的几个情况:
1.同等数据宽度,只要出现 unsigned ,皆以unsigned 运算。 2. 同等符号前缀,自动转化为大位宽大数据范围处理,如 unsigned long long 和 unsigned int ,总以 unsigned long long 处理. 3.不同数据宽度且不同数据符号前缀: <1> unsigned short 和 int ,皆转化为 int 。 int a = -2; unsigned short = 1; a / b 等于 -2 ,因为以 int 计算; int a = 2; unsigned short = -1; a / b 等于 0,因为以int 算,unsigned short 转化为 int ,即为 65535,结果自然为0 <2> unsigned int 和 short ,皆为 unsigned int 运算; unsigned int a = +2 / -2; short b = 1 ; a / b 等于 2或者 0xFFFFFFFE,皆以 unsigned int 算; unsigned int a = -2; short b = -1; a / b 等于0 ,分子小于分母 <3> unsigned int 和 long ,皆按照 unsigned long 运算,严格来说是按照unsigned int; unsigned int a = 2; long b = -1 ; a / b 为0 unsigned int a = -2; long b = 1; a / b 为 0xFFFFFFFE <4> unsigned int 和 long long (__int64),皆按照 long long (__int64)处理 <5> unsigned long long 和 int ,皆按照 unsigned long long 处理 <6 - n> .....
从这些情况,我们不难得出这样的结论,混合符号且混合位宽的数据之间运算,总是以大数据范围大位宽的量为准,再联想到 1.2情况,发现所有的情况都以大数据范围大位宽数为准。
得出的结论是:unsigned 或 signed 混和运算,以大数据大位宽量为准。
注意:验证的时候,不要用 printf 打印出来的数据为准,请反汇编对比。