为什么在int8_t中添加常量会将其提升为更大的类型
Why does adding a constant to an int8_t promote it to a larger type?
在gcc中,将常数与小于int
的积分类型相加或相减会得到int
。
#include <cstdint>
#include <cstdio>
int main()
{
int8_t wat = 5;
printf("%zdn", sizeof(wat + 1));
return 0;
}
给出4。我在将简单的+=
语句与-Wconversion
一起使用时注意到了这一点。设置警告标志后,
#include <cstdint>
int main()
{
int8_t wat = 5;
wat += 5;
return 0;
}
给出
wat.cpp:7:6:警告:从"int"转换为"int8_t{aka signed char}"可能会更改其值[-Wconversion]
有什么方法可以抑制这个警告吗?为什么会发生这种情况?选角似乎没用。
根据C++标准
10许多期望算术或枚举类型导致类似中的转换和生成结果类型方式目的是生成一个通用类型,该类型也是结果。这种模式被称为通常的算术转换,
通常的算术转换包括积分提升
1布尔、char16_t、char32_t以外的整数类型的prvalue,或wchar_t,其整数转换秩(4.13)小于如果int可以表示所有源类型的值;否则,源prvalue可以是转换为无符号整数类型的prvalue。
所以在这个表达式中
wat += 5;
相当于
wat = wat + 5;
赋值右侧的wat
转换为类型int
,表达式wat + 5
的类型为int。由于类型int
的值范围大于类型int8_t
的值范围,编译器会发出警告。
警告消息还显示了如何抑制警告:[-Wconversion]
相关文章:
- ArduinoJson 6.15.2:JsonObject没有命名类型
- 防止主数据类型C++的隐式转换
- 大量序列中核苷酸类型的快速计数
- 如何从C++中的依赖类型中获得它所依赖的类型
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- 是否可以初始化不可复制类型的成员变量(或基类)
- 如何获取std::result_of函数的返回类型
- 从父命名空间重载类型
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 我想将一个对T类型的非常量左值引用绑定到一个T类型的临时值
- Openssl 1.1.1d无效使用不完整的类型"struct dsa_st"
- 访问者访问变体并返回不同类型时出错
- 在VS2010-VS2015下编译时,如何使用decltype作为较大类型表达式的LHS
- 处理小于cpu数据总线的数据类型.(c++转换为机器代码)
- C++ 雷神库 - 使用资源加载器类时出现问题(不命名类型)
- 模板元程序查找相似的连续类型名称
- 是否可以从int转换为enum类类型
- 构造函数正在调用一个使用当前类类型的函数
- IBM Informix 数据库中 INT8 类型的 RFX 等效数据类型
- 数据类型为float、float4、float8、double、double4、int、int4、int8的模板