c语言:有符号数和无符号数隐式转换带来的bug
目录
1. 一个案例
2. 解析
3.参考文献
1. 一个案例
有符号数到无符号数的隐式强制类型转换常常会带来某些非直观的行为,这些非直观的特性常常会导致程序的错误,而且这种包含隐式强制类型转换的细微差别很难被发现。下面一个案例用来说明这样的错误。
文件名:int2un.c
#include
#include float SumElements(float a[], unsigned length)
{int i = 0;float result = 0.0;unsigned tmp = length - 1;printf("result: %u\n", tmp);for (i = 0; i < length-1; i++){ result += a[i];} return result;
}int main()
{float result = 0.0;float a[3] = {1.0,2.0,3.0};printf("int to unsigned int!!!\n");//result = SumElements(a,3);result = SumElements(a,0);printf("result: %f\n",result);
}
编译和运行结果如下:
xuehaiyang@xuehaiyang-VPCEG27YC c_points $ gcc int2un.c -o int2un
xuehaiyang@xuehaiyang-VPCEG27YC c_points $ ./int2un
int to unsigned int!!!
result: 4294967295
Segmentation fault (core dumped)
2. 解析
问题出现在了(length-1)上,当调用的函数的形参length为0时,我们以为(length-1)的结果是-1,但实际上(length-1)的结果是以无符号的类型解析“-1”(有符号的二进制字节),会得出一个很大的数(4294967295: 32位最大的数),累加的范围超过了a[],所以报错!!
3.参考文献
《深入理解计算机系统》
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
