double a;
a = 3669.0;
int b;
b = a;
Run Code Online (Sandbox Code Playgroud)
我在b中得到3668,而不是3669.
我该如何解决这个问题?如果有这样的3559.8我也想要像3559而不是3560.
当我遇到一些我觉得奇怪的行为时,我正在研究一个嵌入式项目.我设法在键盘上重现它(见下文)以确认,但我的机器上没有任何其他C编译器可以在它们上进行尝试.
场景:我有一个#define
32位整数可以容纳的最负值,然后我尝试使用它来与浮点值进行比较,如下所示:
#define INT32_MIN (-2147483648L)
void main()
{
float myNumber = 0.0f;
if(myNumber > INT32_MIN)
{
printf("Everything is OK");
}
else
{
printf("The universe is broken!!");
}
}
Run Code Online (Sandbox Code Playgroud)
键盘链接:http://codepad.org/cBneMZL5
对我来说,看起来这个代码应该可以正常工作,但令我惊讶的是它打印出来The universe is broken!!
.
此代码隐式地将其转换INT32_MIN
为a float
,但事实证明,这会导致浮点值为2147483648.0
(正!),即使浮点类型完全能够表示-2147483648.0
.
有没有人对这种行为的原因有任何见解?
代码解决方案:正如Steve Jessop在他的回答中提到的,limits.h
并且已经stdint.h
包含正确的(工作)int
范围define
,所以我现在使用这些而不是我自己的#define
问题/解决方案解释摘要:鉴于答案和讨论,我认为这是对正在发生的事情的一个很好的总结(注意:仍然阅读答案/评论,因为它们提供了更详细的解释):
long
S,SO大于任何值LONG_MAX
且小于或等于ULONG_MAX
随后L
后缀的类型为unsigned long
(-2147483648L)
实际上是-
一个unsigned …
当打开优化时,下面的代码会在gcc上产生不同的结果.如果没有优化,gcc会产生与clang相同的结果.
#include <cfloat>
#include <cstdint>
double big_dbl() { return DBL_MAX; }
int main() {
return static_cast<std::uint16_t>(big_dbl());
}
Run Code Online (Sandbox Code Playgroud)
汇编器输出-O0
显示gcc和clang都调用empty_dbl
并用于cvttsd2si
执行浮点 - > int转换,然后转换为16位无符号值并生成0
.调高优化级别以-01
优化empty_dbl
两个编译器中的调用,但clang仍然0
作为强制转换的结果给出,而gcc给出65535.结果可以在编译器资源管理器中看到.
这是gcc优化器中的错误还是未定义的行为,因此优化器可以做它喜欢的事情?
这最近让我们感到困惑,在某种意义上,谢天谢地,因为它显示了一个big_dbl
错误使用的场景,我们已经正确修复了代码,但我想了解与gcc的不同之处.
#include <iostream>
#include <cmath>
using namespace std;
int main(){
int n;
cin >> n;
int i = sqrt(1 + 2 * n * (n + 1)) - 1;
cout << i;
}
Run Code Online (Sandbox Code Playgroud)
我编写了一个简单的程序,它利用了sqrt()
C++ 中的函数。即使输入sqrt()
为正,上述程序也会在控制台上打印出 n = 32768 的负值。我尝试将语句从 更改为int i = sqrt(1 + 2 * n * (n + 1)) - 1;
,
double i = sqrt(1 + 2 * n * (n + 1)) - 1;
但错误未解决。
输出:
32768
-2147483648
上面的输出是为了 int i = …