关于unsigned int 和 int

1,499 阅读2分钟

在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;
}