Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/160.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 相同的C源,不同的输出_C++_C_Compilation_Binary_Mingw - Fatal编程技术网

C++ 相同的C源,不同的输出

C++ 相同的C源,不同的输出,c++,c,compilation,binary,mingw,C++,C,Compilation,Binary,Mingw,我发现了我几年前实现的一个旧的C源代码,以及它编译的二进制可执行文件 我在一篇评论中写道,编译命令是: gcc -O3 source.c -o executable -lm 所以我重新编译了它,但是新的可执行文件与旧的不同(大小) 事实上,如果我运行新的和旧的可执行文件,它们会给我不同的结果:旧的可执行文件返回多年前返回的相同结果,而新的可执行文件返回不同的结果 我的目标是能够重新编译源代码并获得与旧代码相同的可执行文件(或者至少是产生完全相同结果的可执行文件)。 我确信我使用相同的参数运行这

我发现了我几年前实现的一个旧的C源代码,以及它编译的二进制可执行文件

我在一篇评论中写道,编译命令是:

gcc -O3 source.c -o executable -lm
所以我重新编译了它,但是新的可执行文件与旧的不同(大小)

事实上,如果我运行新的和旧的可执行文件,它们会给我不同的结果:旧的可执行文件返回多年前返回的相同结果,而新的可执行文件返回不同的结果

我的目标是能够重新编译源代码并获得与旧代码相同的可执行文件(或者至少是产生完全相同结果的可执行文件)。

我确信我使用相同的参数运行这两个程序,并且代码根本不使用线程。唯一特别的是,我需要随机整数,但我使用自己的函数来生成它们,以确保随机数序列总是相同的(当然,我总是使用相同的种子)

(我以为这是从某个图书馆抄来的)

那会是什么呢?可能是进行编译的操作系统(最初是在WinXP下,现在我正在Win7和Ubuntu下进行尝试),但我一直只使用MinGW。那么也许是MinGW的版本?如果是这样的话,我就麻烦了,因为我不记得几年前我用过哪个版本

我使用的库:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#包括
#包括
#包括
#包括

我所做的只是字符串运算和计算,比如
pow()
sqrt()
,乘法和加减,以便应用启发式优化算法来近似解决一个NP难问题:结果都是问题的解,但是它们的适用性不同。

我要检查的第一件事是int的大小。您的代码依赖于溢出,整数的大小可能很重要

您的代码似乎暗示int至少是32位的(您使用的是0x269EC3),但现在可能是使用64位的int进行编译


我不担心可执行文件,两个不同的编译器不太可能得到相同大小的文件。

您能分享更多关于程序生成的输出类型的信息吗?这两个版本之间到底有什么不同?听起来像是代码中的错误。是否依赖于未定义或特定于实现的行为?@Enne如果使用未定义的行为,则可能有两种不同但正确的结果。但是你没有描述它们是如何不同的,而且是正确的,所以我们没有工具来帮助你。这就是说,这可能与浮点处理的差异有关。你是不是做了很多浮点运算,而处理器有扩展精度(像Intel)?在这种情况下,结果可能取决于编译器何时溢出到内存,何时不溢出(或者它是否使用较新的SSE指令)。@Enne
像pow()、sqrt()
这样的计算如果这些操作是算法的固有部分,因此,在不同版本的编译器上得到不同的结果也就不足为奇了。如果您正在测试浮点计算之间的相等性,并且这些测试的结果决定执行代码的哪一部分,则尤其如此。不,不存在“溢出”。该算法是无符号整数,它被定义为产生一个特定的结果,该结果以2的次高幂为模。我无法想象OP会意外地切换到64位。不是这样,我没说这是一种未定义的行为。在
无符号int
情况下溢出的行为取决于大小。这就是我的意思。我也没有。我说没有“溢出”。该标准明确规定(引号)“无符号算术不会溢出”。是的,结果取决于大小,但“溢出”仍然与此无关。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>