C++备忘录106:safe signed/unsigned comparison

C++中无符号数和有符号数的比较永远让人提心吊胆

void foo() {
	int i = -1;
	unsigned j = 1;
	if (i > j) {
		// this branch is taken
	} else {
		//
	}

C++20中,<utility>增加了比较函数,处理这种情况

#include <utility>

extern int i;
extern unsigned j;

bool unsafe() {
    return i < j; // 可能-1 > 1
}

bool safe() {
    return std::cmp_less(i, j); // 永远安全
}

比较汇编可以发现cmp_less之类的函数会产生额外的开销,所以如果确实有符号数不可能为负数的情况下,使用这些新函数恐怕不是好的选择

P.S. std::in_range可以用于坚持参数是否在某类型的合法范围内

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: signed/unsigned mismatch指的是在程序中使用了不同类型的变量进行比较或运算,其中一个是有符号类型(signed),另一个是无符号类型(unsigned),这样会导致类型不匹配的错误。例如,当一个有符号整数和一个无符号整数进行比较时,就会出现signed/unsigned mismatch错误。这种错误可能会导致程序运行异常或崩溃。为避免这种错误,应该在程序中尽可能使用相同类型的变量进行比较和运算。 ### 回答2: signed/unsigned mismatch 是一种编程错误,通常由于使用错误的类型进行操作而导致。signedunsigned 是两种不同的数据类型,分别用来表示有符号和无符号整数。signed 数据类型表示包含符号的整数,可以是正数、负数或零;而 unsigned 数据类型表示仅包含正整数或零的无符号整数。 在 C++ 中,当将一个 signed 数据类型的变量与一个 unsigned 数据类型的变量进行操作时,将导致 signed/unsigned mismatch 错误。这是因为 signed 类型可以存储负值,而 unsigned 类型只能存储非负值。当 signed 数据类型的变量与 unsigned 数据类型的变量进行运算时,编译器会将两个类型转换为相同的类型,这可能导致数据丢失或截断。 例如,如果使用一个 unsigned 数据类型的变量来表示负数,例如 -10,那么出现 signed/unsigned mismatch 错误就会变得非常常见。在这种情况下,编译器将尝试将该负数转换为无符号整数类型,这将导致数据错误或意外结果。 为了避免 signed/unsigned mismatch 错误,应该始终使用正确的数据类型来表示数值。如果需要将 signed 数据类型的变量与 unsigned 数据类型的变量一起使用,应该明确地表示它们的类型转换,以确保数据的正确性。可以使用 C++ 中的 static_cast 运算符来执行显式类型转换。 总之,signed/unsigned mismatch 错误是一种常见的编程错误,可以通过使用合适的数据类型并进行显示类型转换来避免。在编写代码时应该务必小心并仔细审查代码以确保正确性。 ### 回答3: signed/unsigned mismatch是C/C++程序中一个比较常见的错误,通常会在编译阶段被检测到,也可能在运行时会导致程序出现不可预测的错误或者异常。 signed/unsigned mismatch通常是由于不同类型的整数在表达式中混合使用而发生的。例如,当一个signed int类型的变量和一个unsigned int类型的变量进行运算时,就会发生signed/unsigned mismatch的错误。 此外,还有一种情况可能会引起signed/unsigned mismatch的错误,那就是在使用循环计数器时未正确处理数据类型,例如使用signed int型的变量计数并与unsigned int型的变量进行比较。 这个错误发生时的结果可能是期望不一样的或者可能会导致程序崩溃。因此,为了避免这种错误的发生,程序员需要注意一些细节。例如,当我们定义循环计数器时,应该要确保它们的类型相同,或者在将它们混合使用之前先进行类型转换,例如将signed int类型的变量转换为unsigned int类型的变量。 此外,在进行计算或比较之前,我们也应该根据实际需要考虑变量的类型,如果我们需要使用无符号变量,则应该将所有的变量都定义为无符号类型,或者进行适当的强制类型转换。 总之,signed/unsigned mismatch是一个常见的错误,但是只要我们注意避免类型混杂,以及在需要使用无符号变量时使用正确的类型,就可以避免这种错误的发生。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值