这两天的工作需要涉及到对无符合数,有符号数作混合运算。
作了一些实验,发现自己写了这么多年的程序,以前对于符号数计算相关的理解居然仍存在一些盲点。
有符号数与无符号数混合运算可能有三种混合方式
1。操作数全为有符号数
如:
int a = -1;
int b = 2;
a + b;
2。操作数全为无符号数
如:
unsigned int a = (unsigned int)-1;
unsigned int b = 2;
a + b;
3。操作数混合了有符号数,无符号数
如:
int a = -1;
unsigned int b = 2;
a / b;
情形1和2就不用说了,因为运算中涉及的都是相同符号特征的操作数,计算过程中不会引起歧义。
而对于情形3,由于涉及到了符号特性相异的操作数,情况就有些复杂了。
这里先说一下,对于有些运算操作,是要区分有符号与无符号的情况的。比如有符号的除法与无符号
的除法,有符号的取模运算与无符号的取模运算,其计算语意是不同的,具体来说,有符号的除法在x86
平台上对应的汇编指令是idiv,而无符号的除法对应的则是div。
而对于另外一些操作运算,则是不区分有符号与无符号的,比如,加法,减法,乘法运算。
对于不同操作符与符号相关的情形可以通过下面的小程序来验证:
作了一些实验,发现自己写了这么多年的程序,以前对于符号数计算相关的理解居然仍存在一些盲点。
有符号数与无符号数混合运算可能有三种混合方式
1。操作数全为有符号数
如:
int a = -1;
int b = 2;
a + b;
2。操作数全为无符号数
如:
unsigned int a = (unsigned int)-1;
unsigned int b = 2;
a + b;
3。操作数混合了有符号数,无符号数
如:
int a = -1;
unsigned int b = 2;
a / b;
情形1和2就不用说了,因为运算中涉及的都是相同符号特征的操作数,计算过程中不会引起歧义。
而对于情形3,由于涉及到了符号特性相异的操作数,情况就有些复杂了。
这里先说一下,对于有些运算操作,是要区分有符号与无符号的情况的。比如有符号的除法与无符号
的除法,有符号的取模运算与无符号的取模运算,其计算语意是不同的,具体来说,有符号的除法在x86
平台上对应的汇编指令是idiv,而无符号的除法对应的则是div。
而对于另外一些操作运算,则是不区分有符号与无符号的,比如,加法,减法,乘法运算。
对于不同操作符与符号相关的情形可以通过下面的小程序来验证:
