为什么编译器不会使用 size_t 生成负值警告?
Why compiler doesn't generate warnings for negative value with 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
负值的警告?
由于 size_t
在C++中始终是无符号的:
类型
size_t
是实现定义的无符号整数类型,其大小足以包含任何对象的大小(以字节为单位)。
为什么编译器不使用size_t生成负值警告?
因为size_t
分配负值会调用有符号到无符号的转换,这是明确定义的:
如果目标类型是无符号的,则结果值是与源整数全等的最小无符号整数(模 2n,其中 n 是用于表示无符号类型的位数)。[注意:在二进制补码表示中,这种转换是概念性的,位模式没有变化(如果没有截断)。
相关文章:
- 如何修复编译器警告 C6386 和 C6385?
- 编译器警告:执行到达值返回函数的末尾而不返回值
- 为什么布尔开关语句有编译器警告?
- 奇怪的缩小转换在 g++ 编译器中加倍到浮点警告
- 处理编译器关于可能丢失数据的警告的最优雅方法是什么
- 使用 reverse_iterator 而不是const_reverse_iterator并获得讨厌的编译器警告和错误
- 添加 c++11 编译器后打开 devc++ 时显示的警告
- 来自 std::chrono 的编译器警告,但未被使用
- 警告级别为 3 的 int 的 std::vector push_back 处的编译器警告
- G++ 编译器未为未定义的方法生成错误/警告
- 从 int 中剥离位时,编译器会警告一个转换,但不警告其他转换.有解决方法吗?
- 有没有办法在从临时返回按值string_view时获得编译器警告?
- 常量更改而不const_cast<> 为什么没有编译器警告/错误?
- 为什么编译器不在同一翻译单元中警告 ODR 违规
- C++语法错误,编译器不会警告或 int v = func(&v) 出错;
- C++ 添加编译器警告,以错误使用自定义打印/日志功能
- 我正在尝试在我的类中创建一个静态成员,但编译器警告我它是未定义的
- 是否可以将移动的变量标记为不再可用,并在使用它时收到编译器警告?
- 为什么我应该始终启用编译器警告
- 使用Boost :: black在boost :: variant中使用时,请警告编译器