在c++里面,如果一个表达式里面同时有 unsigned int 和 int ,执行的时候会尝试把 int 转成 unsigned int。
- 这个时候如果int的值是非负的,执行的结果当然和预期一样
- 但是如果int的值是负数,它的值就变成 int的最大值 + 原值
参考例子:
// 有符号的向无符号的转
float sum_elements(float a[], unsigned length)
{
int i;
float result = 0;
// 这段代码问题在于:length为无符号的,当length为0时,减去1,变为-1,但
// 因为类型本身是无符号的,因此会自动转为一个非常大的数,这会导致for循环一直生效
// 解决方法:length声明为int 或者 条件改为 i < length
for (i = 0; i <= length - 1; i++) {
result += a[i];
}
return result;
}
//size_t strlen(const char* s);
int strlonger(char* s, char* t)
{
// 这段代码的问题在于:两个strlen得到的都是unsigned int,如果s的长度小于t的长度
// 相减之后,首先得到的仍是类型为unsigned int的数值,因为s < t,则是负数,会自动
// 转为非常大的正数,因此结果是错误的。
// 解决方法:return strlen(s) > strlen(t)
return strlen(s) - strlen(t) > 0;
}
int main()
{
// case 1
unsigned int x = 5;
if (x < -2) {
// 输出 x < -2
// signed 与 unsigned int 比较时,会先将signed 转为unsigned int
// 因此-2转为非常大的正数了
cout << "x < -2" << endl;
}
// case 2
unsigned int a = -1;
unsigned int b = -2;
// 输出:4294967295 4294967294
// 因为-1是signed,转为unsigned int的a时,变成非常大的正数
cout << a << " " << b << endl;
// case 3
string s;
// s.size()函数返回的也是一个无符号整数,-1转为unsigned int,是一个非常大的值
if (s.size() < -1) {
cout << "s.size() < -1" << endl;
}
return 0;
}