C++ 在Qt中打印8字节整数时出错

C++ 在Qt中打印8字节整数时出错,c++,qt,struct,C++,Qt,Struct,我试图将字节流分配给结构。该流正确地进入结构,因为我可以在调试窗口中看到它,但当我试图打印它时,结构没有正确显示8字节整数值 输出: serial no :: 1 Timestamp :: -1541974141 userid :: 0 代码: #包括 #pragma包(推送,1) 结构信息 { int序列号; 长时间戳; int用户标识; }; #布拉格语(流行语) int main(int argc,char*argv[]) { qcorea应用程序(argc、argv); 无符号字符ar

我试图将字节流分配给结构。该流正确地进入结构,因为我可以在调试窗口中看到它,但当我试图打印它时,结构没有正确显示8字节整数值

输出:

serial no :: 1
Timestamp :: -1541974141
userid :: 0
代码:

#包括
#pragma包(推送,1)
结构信息
{
int序列号;
长时间戳;
int用户标识;
};
#布拉格语(流行语)
int main(int argc,char*argv[])
{
qcorea应用程序(argc、argv);
无符号字符arr[16];
arr[0]=0x01;
arr[1]=0x00;
arr[2]=0x00;
arr[3]=0x00;
arr[4]=0x83;
arr[5]=0x57;
arr[6]=0x17;
arr[7]=0xA4;
arr[8]=0xF6;
arr[9]=0x00;
arr[10]=0x00;
arr[11]=0x00;
arr[12]=0x00;
arr[13]=0x00;
arr[14]=0x00;
arr[15]=0x00;
信息*var;
var=(info*)和arr[0];
printf(“序列号::%d\n”,变量->序列号);
printf(“时间戳::%d\n”,var->Timestamp);
printf(“userid::%d\n”,var->userid);
返回a.exec();
}
请阅读,这是因为系统的体系结构,您看到了这种行为

在big-endian中,整数值从低到高存储在内存中。在小端系统上,它是相反的。

阅读它是因为系统的体系结构,您看到这样的行为

在big-endian中,整数值从低到高存储在内存中。在小endian系统上,反之亦然。

这就是为什么
printf()
和朋友不被鼓励的原因。它们不是类型安全的<代码>%d打印一个
int
。您正在传递一个
long
,因此
printf()的内部结构将其截断为
int
部分

改为使用
std::cout
,这将使用适当大小的重载:

#include <iostream>

std::cout << "serial no :: " << var->serialno << '\n';
std::cout << "Timestamp :: " << var->timestamp << '\n';
std::cout << "userid :: " << var->userid << '\n';
#包括
std::cout这就是为什么
printf()
和朋友不被鼓励的原因。它们不是类型安全的<代码>%d
打印一个
int
。您正在传递一个
long
,因此
printf()的内部结构将其截断为
int
部分

改为使用
std::cout
,这将使用适当大小的重载:

#include <iostream>

std::cout << "serial no :: " << var->serialno << '\n';
std::cout << "Timestamp :: " << var->timestamp << '\n';
std::cout << "userid :: " << var->userid << '\n';
#包括

std::我是endian方面的专家,目前我使用的是little endian系统,字节流也是little endian,问题与使用qdebug而不是printf时的printf打印格式有关。请在“%d”处写上“%lu”或“%zu”,以代替“%d”我是endian方面的专家,目前我使用的是little endian系统,字节流也是little endian,当我使用qdebug而不是printf其工作精细度时,问题与printf打印格式有关。请根据情况写“%lu”或“%zu”以代替“%d”所以我认为现在使用qdebug不可能使用printf。如果你真的坚持使用一个不安全的C样式函数(<代码> Primff())/Cube >,而不是惯用的C++方式(<代码> STD::CUT),代码可以正常工作,你可以使用<代码> %LLD作为格式说明符。看见请注意,
qdebug
仅在调试版本中工作。因此,我认为现在使用qdebug时不可能使用printf。如果你真的坚持使用一个不安全的C样式函数(<代码> Primff())/Cube >,而不是惯用的C++方式(<代码> STD::CUT),代码可以正常工作,你可以使用<代码> %LLD作为格式说明符。看见请注意,
qdebug
仅在调试版本中工作。格式字符串错误!它应该是:
printf(“时间戳::%lld\n”,var->Timestamp)。我敢肯定编译器会对此抱怨。错误的字符串格式!它应该是:
printf(“时间戳::%lld\n”,var->Timestamp)。我敢肯定编译器会对此抱怨。