首页 > 解决方案 > c++代码的安全性与有符号和无符号之间的隐式转换

问题描述

根据此处此处讨论的有符号和无符号整数类型之间隐式转换的规则,当将 anunsigned int与 a相加时int,首先将有符号int转换为 an unsigned int

例如,考虑以下最小程序

#include <iostream>

int main()
{
   unsigned int n = 2;
   int x = -1;

   std::cout << n + x << std::endl;

   return 0;
}

尽管如此,该程序的输出还是 1 正如预期的那样:x首先转换为 a unsigned int,并且与 的和n导致整数溢出,给出“正确”的答案。

在像前一个代码这样的代码中,如果我确定这n + x是正数,我可以假设 和 的总和unsigned int n给出int x期望值吗?

标签: c++

解决方案


在像前一个代码这样的代码中,如果我确定 n + x 是正数,我可以假设 unsigned int n 和 int x 的总和给出预期值吗?

是的。

首先,使用模运算将有符号值转换为无符号值:

如果目标类型是无符号的,则结果值是与源整数一致的最小无符号整数(模 2 n ,其中 n 是用于表示无符号类型的位数)。

然后将使用模算术添加两个无符号值:

无符号整数应遵守算术模 2 n的定律,其中 n 是该特定整数大小的值表示中的位数。

这意味着您将得到预期的答案。

即使结果在数学意义上是负数,C++ 中的结果也将是一个模等于负数的数。

请注意,我在这里假设您添加了两个相同大小的整数。


推荐阅读