问题描述
我经常将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作为第一位的有符号整数是一个负数。因此,无法将两个数字进行比较,这就是为什么必须提供显式转换的原因。