c++ - 相同的 C 源代码,不同的输出

标签 c++ c compilation binary mingw

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

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

gcc -O3 source.c -o executable -lm

所以我重新编译了它,但是新的可执行文件(大小)与旧的不同。

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

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

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

unsigned int seed = 0;
void set_srand(unsigned int aseed) {
    seed = aseed;
}

int get_rand() {
    seed = seed * 0x12345 + 0xABC123;
    int j = (seed >> 0x10) & RAND_MAX;
    return j;
}

(我以为这是从某个图书馆复制的)。

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

我使用的库:

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

我所做的只是字符串操作和计算,如 pow()sqrt()、乘法和加减法,以便将启发式优化算法应用于近似解决一个NP-hard问题:结果都是问题的解,但它们的适应度不同。

最佳答案

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

您的代码似乎暗示 int 至少是 32 位的(您使用 0x0x269EC3),但也许您现在正在使用 64 位的 int 进行编译。

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

关于c++ - 相同的 C 源代码,不同的输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24056414/

相关文章:

从 gfortran 移植到 ifort 时出现编译错误

c++ - boost同步服务器客户端编译报错

c - 根据变量调整数组的大小

将毫秒转换为 GNU 端口的时间规范

c++ - VC++ 编译器看不到我的任何命名空间和类

c++ - 为什么 CLion 无法在我的 Mac 上编译?

c++ - 抽象类指针参数的默认值

c++ - 为什么将final添加到final类的成员函数中?

c++ - 如何在不创建实例的情况下获取std::array <T,N>中的元素数?

c - 返回 main 的函数