在下面的代码中,我使用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
生成负值警告?
答案 0 :(得分:2)
由于size_t
在C ++中总是无符号的:
类型
size_t
是一个实现定义的无符号整数类型,其大小足以包含任何对象的字节大小。
为什么没有编译器使用size_t生成负值警告?
因为为size_t
分配负值会调用已签名到无符号的转换,该转换定义明确:
如果目标类型是无符号的,则结果值是与源整数一致的最小无符号整数(模2 n ,其中n是用于表示无符号类型的位数)。 [注意:在二进制补码表示中,此转换是概念性的,并且位模式没有变化(如果没有截断)。 - 结束记录]