为什么这个`int`有错误的值?

Dig*_*Man 0 c++ hex byte posix

不知道怎么做,但我会从代码片段和输出开始:

uint32_t expires;

cout << "Expiration bytes: " << setfill('0') << hex
     << setw(2) << (unsigned short)rec[keyLen+4]
     << setw(2) << (unsigned short)rec[keyLen+5]
     << setw(2) << (unsigned short)rec[keyLen+6]
     << setw(2) << (unsigned short)rec[keyLen+7] << endl;

expires = ntohl(*(uint32_t*)&rec[keyLen+4]);

cout << "Expiration: " << (long)expires << endl;

cout << "Hex: " << hex << expires << endl;
Run Code Online (Sandbox Code Playgroud)

输出:

Expiration bytes: 00000258
Expiration: 258
Hex: 258
Run Code Online (Sandbox Code Playgroud)

我可以从程序的其他部分确认检查和输出字节的十六进制表示按预期工作,并且那些确实是字节流中的字节(从另一个应用程序发送).

现在,如果expiration只是举行一些废话,我将能够更好地理解,因为这意味着存在一些令人震惊的错误(可能涉及指针).但是......这显然只是将十六进制值吐出来,好像它是一个小数,这是完全错误的.

更令人困惑的是,这在程序的另一个方面起作用:

fullSize = ntohs(*(uint16_t*)&buff[0]);
Run Code Online (Sandbox Code Playgroud)

字节值为0x0114时,fullSize将包含值276.

所以问题是,这里到底发生了什么?int怎么可能出错

Lin*_*cer 16

hex是粘性的,所以除非你重置它,否则cout将继续输出十六进制的东西.

您可以通过发送std::dec到流来重置它.或者,您可以构建一个更高级的机制来存储原始状态并在之后恢复它.


Wer*_*nze 11

cout << "Expiration: " << dec << (long)expires << endl; 将输出十进制,否则最后一个设置(十六进制或十进制)仍然有效.