无符号和有符号之前暗藏杀机你get到了吗,不要在遇到坑了
一、直接上代码
大家看看这段代码有什么错误吗?
float sum_elements(float a[], unsigned length)
{
int i = 0;
float sum = 0;
for(i = 0; i <= length -1; ++i)
sum += a[i];
return sum;
}
仔细观察,再仔细观察。。。。这个函数一看就是求一个数组的和,但是我要是告诉你这段代码有致命的错误可能你不信。
错误点: 如果当前的数组的大小为0,length-1=-1,然后0<=-1这句话始终成立跟while(1)没什么区别。程序就会一直在这出错。
二、不卖关子了,看知识点
简单一句: 无符号于有符号的运算会将有符号的转化成无符号进行运算,其他运算倒是无所谓但是> <比较就会出错。
例如:
int a=-1;
unsigned int b=1;
if(a>b)
{
}
if始终为真,-1最后被转化为无符号为4 294 967 295,实际是补码形式1111 1111 1111 1111=2^32=4 294 967 295跟1比较。
解决: if(a>(int)b)这样就OK了
这篇也是 小弟在看别人的代码发现的,欢迎大佬指点 欢迎大佬指点
小白一直在努力