【问题标题】:Why compiler doesn't generate warnings for negative value with size_t? [duplicate]为什么编译器不会为 size_t 的负值生成警告? [复制]
【发布时间】:2018-04-08 16:09:28
【问题描述】:

在下面的代码中,我使用了size_t 作为函数参数并传递了负值。我已经使用以下命令在 GCC(Linux) 上编译了程序。

g++ -Wall size.cpp -o size

GCC 编译成功,没有警告,但结果不是我期望的:

size_t : 18446744073709551615
int : -1

代码:

#include <iostream>

void func1(size_t i) 
{
  std::cout << "size_t : " << i << std::endl;
}

void func2(int i) 
{
  std::cout << "int : " << i << std::endl;
}

int main() 
{
  func1(-1);
  func2(-1);
  return 0;
}

为什么编译器不会为带有size_t 的负值生成警告?

【问题讨论】:

  • size_t 是无符号类型。
  • 我建议你了解一下two's complement,这是一种(也是最常见的)负整数编码方式。
  • @Some程序员老兄为什么编译器不为size_t的负值生成警告?
  • 您期待什么?请编辑您的问题。

标签: c++ c++11 gcc unsigned-integer size-t


【解决方案1】:

由于size_t 在 C++ 中始终是无符号的:

size_t 类型是实现定义的无符号整数类型,其大小足以包含任何对象的字节大小。


为什么编译器不为 size_t 的负值生成警告?

因为给size_t 分配一个负值会调用有符号到无符号的转换,这是明确定义的:

如果目标类型是无符号的,则结果值是与源整数一致的最小无符号整数(模 2n,其中 n 是用于表示无符号类型的位数)。 [注意: 在二进制补码表示中,这种转换是概念性的,位模式没有变化(如果没有截断)。 —尾注]

【讨论】:

  • 有很多定义明确的操作会产生警告。例如。 if(test = 1) 至少使用 Clang C++ 编译器提供 warning: using the result of an assignment as a condition without parentheses [-Wparentheses]。所以定义明确并不是不产生警告的充分条件。
猜你喜欢
  • 1970-01-01
  • 2015-04-12
  • 1970-01-01
  • 2023-03-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多