unsigned 与signed

来源:互联网 发布:php直销系统源码下载 编辑:程序博客网 时间:2024/06/13 22:55

#include <stdio.h>
#include <string.h>

int main()
{
int x = 2;
char * str = "abcd";
 int y = (x - strlen(str) ) / 2;

printf("%d\n",y);
}



结果应该是 -1 但是却得到:2147483647 。为什么?因为strlen的返回值,类型是size_t,也就是unsigned int ,与 int 混合计算时类型被自动转换了,结果自然出乎意料。。。
观察编译后的代码,除法指令为 div ,意味无符号除法。
解决办法就是强制转换,变成 int y = (int)(x - strlen(str) ) / 2; 强制向有符号方向转换(编译器默认正好相反),这样一来,除法指令编译成 idiv 了。