一、负数取绝对值需要注意的地方
1、以下代码
char a=-128;
if(a<0) a=-a;
所以a的值会为多少?
a依然为-128;
2、如果相关函数延伸
void doSetData(char setdata, char desdata)
{
xxx;
xxx;
if(setdata<0)
setdata=-setdata;
desdata=setdata;
}
desdata结果会依然是负数;将desdata传出去后,可能会对程序造成重大影响;
上述两个函数逻辑都会产生bug,是个临界测试,
所以取绝对值的左边最好都定义成无符号类型的。
二、无符号数和有符号数的比较
1、当无符号数和有符号数进行比较时,看下面例子:
if(i<limit)这行代码, 如果不注意会产生bug:
实际规则会如下:
如果一个操作数具有一个有符号的类型T,其转换等级比另一个操作数的等级高,并且T足以表示另一个操作数的所有可能值,则另一个操作数会被转换为T类型;如T不足以表示,则两个操作数都会被转换为“有符号的类型T”的无符号类型。
所以在if(i<limit)中,
i是有符号,limit又不足以表示i的所有值,所以,i和limit都会被装换为int的无符号类型 unsigned int;
所有这条语句永远不会被执行。
2、有负数算术运算需要注意的地方