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

Why compiler doesn't generate warnings for negative value with size_t?

本文关键字:警告 编译器 size 为什么      更新时间:2023-10-16

在下面的代码中,我使用 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 在C++中始终是无符号的:

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


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

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

如果目标类型是无符号的

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