unsigned 与signed
2013-05-25 21:15
162 查看
#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 了。
#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 了。
相关文章推荐
- c++关于signed和unsigned
- 不带signed或unsigned关键字的char型 无符号数? 有符号数? C标准规定为 Implementation Defined !!!
- Signed vs. Unsigned
- 不带signed或unsigned关键字的char…
- 关于C语言中的unsigned和signed内存存储
- 认识unsigned和signed取值范围
- unsigned和signed、const和define的区别
- compare signed with unsigned
- C语言 unsigned 和 signed 类型相互转换深入理解
- signed ,unsigned 关键字
- 一道关于signed和unsigned的微软面试题
- 不带signed或unsigned关键字的char…
- 一个unsigned和signed的漏洞
- unsigned与signed区别
- 关键字-分节5(signed、unsigned)
- 打印分别由signed和unsigned限定的char , short, int ,与long类型变量的取值范围。
- C编程注意32位机器和64位机器的差别及unsigned和signed
- signed 和 unsigned
- [VC]signed和unsigned之间区别
- char, signed char,unsigned char, short int unsigned short int, int数据类型取值问题