隐式转换将符号性“int”更改为“unsigned int”

Posted

技术标签:

【中文标题】隐式转换将符号性“int”更改为“unsigned int”【英文标题】:implicit conversion changes signedness 'int" to 'unsigned int" 【发布时间】:2015-02-11 05:56:12 【问题描述】:

我使用 clang++ 编译程序,我需要在 clang++ 中没有错误地编译它。其他编译器没有错误。

代码中的错误行是

memset(grid_, 0, sizeof(int) * x_quadrants * y_quadrants);

整个函数是这样的:

Ocean::Ocean(int num_boats, int x_quadrants, int y_quadrants)

  grid_ = new int[x_quadrants * y_quadrants];
  memset(grid_, 0, sizeof(int) * x_quadrants * y_quadrants);
  x_quadrants_ = x_quadrants;
  y_quadrants_ = y_quadrants;
  boats_ = new Boat[num_boats];
  num_boats_ = num_boats;

  stats_.hits = 0;
  stats_.misses = 0;
  stats_.duplicates = 0;
  stats_.sunk = 0;

我正在使用 memset,因此在使用不同的驱动程序进行测试时,我不会得到垃圾值输出。没有必要为 clang 提供命令行,因为我不允许更改它。

【问题讨论】:

错误是什么?错误在哪里?构造函数中提到的Ocean的成员变量有哪些类型?当您说“其他编译器没有错误”时,您是什么意思?那里的编译选项是什么? clang 有哪些选择?您的问题缺少很多重要信息。 【参考方案1】:

替换

grid_ = new int[x_quadrants * y_quadrants];
memset(grid_, 0, sizeof(int) * x_quadrants * y_quadrants);

只有

grid_ = new int[x_quadrants * y_quadrants]();

注意括号,它告诉编译器你想要这个零初始化(或真正的值初始化,这里简化为零初始化)。

更好的是,使用std::vector 而不是这种危险的 DIY 方案。

【讨论】:

谢谢,错误现在消失了。顺便说一句,我们实际上还没有涉及任何关于 STL 的内容。所以我不确定如何使用 std::vector 来摆脱这个。【参考方案2】:

sizeof 返回一个未签名的std::size_t。您正在与(签名的)int 变量相乘,因此如果您在 clang 中启用 -Wsign-conversion 则会发出警告。

您可以 static_cast 将维度设置为无符号以避免警告 - 如果需要,添加对负值的防护(例如 assert)。

(您的代码可能会受益于使用member initializer list。)

【讨论】:

感谢您的建议。也许我没有说清楚,但实际上我不允许通过更改命令行来摆脱警告。不过谢谢。 我根本没有告诉你改变命令行,我告诉你如何修复代码以避免警告。 (但在这种情况下,Cheers 的回答更合适。)

以上是关于隐式转换将符号性“int”更改为“unsigned int”的主要内容,如果未能解决你的问题,请参考以下文章

关于C语言中unsigned变量的问题?

xcode构建失败隐式转换失去整数精度:'size_t'(又名'unsigned long')到'socklen_t'(又名'unsigned int')

C++ 隐式转换(有符号 + 无符号)

无法将类型 double 隐式转换为 int

QStandardItem 编辑后将 unsigned int 转换为 int

将 Long 转换为 Unsigned Short Int / Strtol