相同的C源,不同的输出
Same C source, different output
本文关键字:输出 更新时间:2023-10-16
我找到了一个我几年前实现的旧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困难问题:结果都是问题的解,但它们的适应度不同。
我要检查的第一件事是int的大小。你的代码依赖于溢出,整数的大小可能很重要。
你的代码似乎暗示int至少是32位(你使用0x0x269EC3),但也许你现在正在编译64位的int。
我不担心可执行文件,你不太可能得到相同大小的两个不同的编译器
相关文章:
- 递归函数计算序列中的平方和(并输出过程)
- 如何使用 < 和 > 命令获取 c++ 中的输入和输出?
- 请解释"函数1(p1,p2,p3);"的输出
- C++:将控制台输出存储在宏中更好吗
- 创建一个函数以在输入为负数或零时输出字符串.第一次执行用户定义的函数
- 如何在OMNET++中指定与命令行参数组合的输出文件名
- 为什么我的代码在输出中增加了93天
- 如何从void函数输出字符串
- 输入到文件并输出到另一个文件,并将流文件传递给函数
- AES加密到解密未正确输出
- 如何将c++程序的一些输出传递给shell,以便在shell中使用
- 使用C++程序合并排序没有得到正确的输出
- 为什么我不能在不创建字符串变量的情况下使用函数的字符串输出
- C++格式化输出问题
- 将值从二维数组输出到文本文件
- 集合上的输出迭代器:assign和increment迭代器
- 在while循环中输入带有std::cin的字符串后,控制台会输出大量胡言乱语
- 为什么rk4.do_step不输出C++中的初始条件
- 输出没有重复元素的动态数组(收缩数组)C++
- 如何根据单词在文本中出现的概率输出单词