C语言有符号数与无符号数隐式转换弊端
题一
#include<stdio.h>
float sum(float a[], unsigned length) {
int i;
float result = 0;
for (i = 0; i <= length - 1; i++) {
result += a[i];
}
return result;
}
int main() {
float a[5] = {1,1,1,1,1};
printf("%f",sum(a,0));
return 0;
}
理应答案应该是0.0,但运行时会遇到内存错误。解释下为什么?如何修改程序?
解释
无符号数表示范围:0~2^32-1(32位)
无符号数进行运算或比较时,会将有符号数转换为无符号数。
修改
将unsigned换成int
题二
#include<stdio.h>
int main()
{
int a = -1;
unsigned int b = 16;
if(a > b)
printf("负数竟然大于正数了!\n");
return 0;
}
输出
负数竟然大于正数了!
解释
这是因为a和b进行比较的时候,编译器将有符号数a看成了无符号数,然后再和b进行比较,在内存中(32位)
a : 11111111 11111111 11111111 11111111
b : 00000000 00000000 00000000 00010000
看成无符号数,自然是a>b。
解决方案
禁用无符号数