我应该始终将适当的文字用于数字类型
Should I always use the appropriate literals for number types?
我经常在表达式中使用错误的文字,例如将浮子除以INT,这样:
float f = read_f();
float g = f / 2;
我相信编译器将在这种情况下首先将int(2)转换为浮动,然后使用分区操作员。海湾合作委员会和Clang总是让这样的事情通过,但是Visual C 警告了隐性转换。所以我必须这样写:
float f = read_f();
float g = f / 2.0f;
让我想知道:我应该总是将适当的文字用于浮动,双,长等吗?我通常只要能逃脱它,我就会使用int文字,但是我不确定这实际上是一个好主意。
- 这可能是造成细微错误的原因吗?
- 这只是表达式或功能参数的问题吗?
- 是否有警告或clang警告这种隐性转换的警告级别?
- unsigned int,long int等怎么样?
您应始终明确指出您打算使用的字面类型。例如,当这种代码:
时,这将防止问题float foo = 9.0f;
float bar = foo / 2;
更改以下,截断结果:
int foo = 9;
float bar = foo / 2;
当您涉及过载和模板时,功能参数也是一个问题。
我知道GCC有-Wconversion
,但我不记得它涵盖的所有内容。
对于适合int
中的整数值,我通常不符合long
或unsigned
的资格,因为对于细微的错误通常会少得多。
从来没有一个绝对正确的答案。谁将使用此代码,以及什么?这很重要。但是,尤其是与浮子有关的任何事情,最好养成准确指定所需操作的习惯。float*float
在单精制中完成。双重精确完成的任何操作,2
都会转换为双重精神,因此您在此处指定不同的操作。
这里最好的答案是每个计算机科学家对浮点算术的了解。我会说不要tl; dr,浮点没有简单的答案。
相关文章:
- 1d 智能指针不适用于语法 (*)++
- 使用C++库在Android项目中修改gradle中的cmake参数,用于插入指令的测试
- 用于访问容器<T>数据成员的正确 API
- 重载操作程序时出错>>用于类中的字符串 memebr
- 如何防止 c++ 在从浮点型转换为双精度型(不适用于 IO)时添加额外的小数?
- C++中的cin.ignore()函数不适用于整个流
- 没有用于初始化C++中的变量模板的匹配构造函数
- constexpr 函数中的非文字(通过 std::is_constant_evaluated)
- 用于C++中带有数组和指针的循环
- 我可以使用条件运算符初始化C风格的字符串文字吗
- 为什么它不适用于Visual 2019的原因
- 使用在用于SFINAE的void_t中具有参数的方法
- 在createdialog创建的窗口中捕获用于编辑控件的OnMouseMove消息
- 重载==不适用于二进制树
- 为什么我的类的副本初始化不适用于使用字符串文字的string_view?
- 可以一个#define一个文字字符串,其中包含用于资源文件的非ANSI字符的字符串
- C++11 initializer_list不适用于嵌入对象的文字常量值?
- 我应该始终将适当的文字用于数字类型
- 用于编译时字符串文字连接的宏的c++替代方案
- 可视化C++宏如何用于两个字符串文字