我很久以前就有别人写的大型C++项目.它包含如下代码:
string CVersion::GetVersionStr() const
{
string ret;
char VersionStr[100];
DWORD v1, v2, v3, Build;
GetVersion(&v1, &v2, &v3, &Build);
sprintf(VersionStr, "%d.%d.%d.%d", v1, v2, v3, Build);
return string(VersionStr);
}
Run Code Online (Sandbox Code Playgroud)
现在我认为由于格式说明符(%d)格式错误,此代码具有未定义的行为.
DWORD 在我的电脑上声明为
typedef unsigned long DWORD;
Run Code Online (Sandbox Code Playgroud)
我的问题是:
PS.这个软件是用10年前的Visual Studio编写的
我想找出(short/int/long/float/double/long double/char)大小,所以我写了这段代码:
printf("short\t\t%d\n", sizeof(short));
printf("int\t\t%d\n", sizeof(int));
printf("long\t\t%d\n", sizeof(long));
printf("float\t\t%d\n", sizeof(float));
printf("double\t\t%d\n", sizeof(double));
printf("long double\t%d\n", sizeof(long double));
printf("char\t\t%d\n", sizeof(char));
Run Code Online (Sandbox Code Playgroud)
但输出是:
type bytes
short 512
int 512
long 1024
float 1024
double 1024
long double 1024
char 256
Run Code Online (Sandbox Code Playgroud)
为什么字节数如此之大?
不应该是2,8,......?
考虑以下代码:
#include <stdio.h>
int main() {
printf("%lf %ld\n", 1234.0, 5678L);
printf("%lf %ld\n", 5678L, 1234.0);
}
Run Code Online (Sandbox Code Playgroud)
两次调用都printf打印相同的 text 1234.000000 5678,这与第二次调用的代码不太匹配(可能应该是5678.0000 1234)。
我使用的是 x86-64 处理器上的 Linux 4.x,但我无法在 x86(32 位)上重现这一点。我认为它可以在 amd64 架构上的任何 Linux 系统上重现。
为什么交换的参数为 提供相同的输出printf,以及为什么它特定于 x86-64?