一、负数取绝对值需要注意的地方
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、有负数算术运算需要注意的地方