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

时间:2012-01-13 17:17:58

标签: c++ hex posix byte

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

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;

输出:

Expiration bytes: 00000258
Expiration: 258
Hex: 258

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

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

为了使问题更加混乱,这在程序的另一个方面起作用:

fullSize = ntohs(*(uint16_t*)&buff[0]);

如果字节值为0x0114,则fullSize将包含值276。

所以问题是,这里到底发生了什么? int如何错误

3 个答案:

答案 0 :(得分:16)

hex很粘,所以除非你重置它,否则cout将继续以十六进制输出内容。

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

答案 1 :(得分:11)

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

答案 2 :(得分:3)

由于您从未将cout切换回十进制输出,因此输出的所有均为十六进制,甚至是cout << "Expiration: " << (long)expires << endl;的输出。