比较C和C ++中不同有符号性的表达的危害是什么?

问题描述

我经常将gcc和g ++与-Wall和-Wextra标志一起使用,因为我不希望我的代码包含任何警告。有时我理解为什么我应该解决编译后出现的警告的原因,而另一些时候我不知道。一个示例是以下警告:

warning: comparison of integer expressions of different signedness: ‘int’ and ‘unsigned int’ [-Wsign-compare]

为解决此警告,我检查了int(或unsigned int,取决于情况)的一致性,并将一种类型转换为另一种类型。我的问题是:不执行此检查可能有什么危害?

解决方法

整数和无符号整数具有相同的位数。但是,对于有符号整数,由于一个人的补码(和c ++ 20的两个补码)的工作方式,第一位可以解释为“符号位”:当它为1时,数字为负。>

因此,以1作为第一位的无符号整数是一个很大的数,而以1作为第一位的有符号整数是一个负数。因此,无法将两个数字进行比较,这就是为什么必须提供显式转换的原因。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...