为什么编译器不会使用size_t生成负值警告?

时间:2017-10-27 06:08:31

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

在下面的代码中,我使用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生成负值警告?

1 个答案:

答案 0 :(得分:2)

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

  

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


  

为什么没有编译器使用size_t生成负值警告?

因为为size_t分配负值会调用已签名到无符号的转换,该转换定义明确:

  

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