同一份C/C++代码在Windows和Linux平台执行结果不一致问题

问题

参考编写了一份C++计算MD5值的代码,发现在Windows环境下计算出的MD5值内容是正确的,但同样代码在Linux环境下得到的结果却截然不同。。。

原因

踩了数据模型不同的大坑。。。
32位环境涉及"ILP32"数据模型,是因为C数据类型为32位的int、long、指针。而64位环境使用不同的数据模型,此时的long和指针已为64位,故称作"LP64"数据模型。

现今所有64位的类Unix平台均使用LP64数据模型,而64位Windows使用LLP64数据模型,除了指针是64位,其他基本类型都没有变。

TYPE LP32 ILP32 LP64 ILP64 LLP64
CHAR 8 8 8 8 8
SHORT 16 16 16 16 16
INT 16 32 32 64 32
LONG 32 32 64 64 32
LONGLONG 64 64 64 64 64
POINTER 32 32 64 64 64

其中LP64ILP64LLP64是64位平台上的字长模型,ILP32LP32是32位平台上的字长模型。

解决方法

在Windows平台下,long类型占四个字节,以下代码正确:

// UINT4 defines a four byte word
typedef unsigned long int UINT4;

在Linux平台下,long类型占八个字节,正确代码应为:

// UINT4 defines a four byte word
typedef uint32_t UINT4;

你可能感兴趣的:(C/C++,c++,windows,linux)