使用char binary会带来意想不到的结果

时间:2011-03-09 21:14:11

标签: c++ byte

我有文件从哪里读到第一个字符 - 意思是前8位。这正是我想要的。我的代码:

char content;
char * pcontent = &content;

src_f.read(pcontent, 1);
cout << (int)content << endl; //prints -62
cout << (unsigned int)content << endl; //prints 4294967234

但是:我确实理解-62。整数可以存储减去值,但4294967234来自哪里?我希望有一些加号小于256(因为最多8位......)。你能否为我澄清一下?

THX!

5 个答案:

答案 0 :(得分:2)

作为说明正在发生的事情的简单示例,请考虑负数的二进制表示。最简单的方法是让最高位表示“负号”:0 =正面,1 =负面

0001 = 1
0011 = 3
1100 = -4
0100 = 4
1011 = -3
1111 = -7
etc

so when you convert -7 to an unsigned int, it becomes 15.

Converting -1 to an unsigned int, it becomes 9.

实际上, 两个补码 用于表示二进制数,以防止出现+0和-0。

请参阅维基文章:http://en.wikipedia.org/wiki/Two%27s_complement

答案 1 :(得分:2)

强制转换将-62视为4字节有符号整数并将其转换为4字节无符号整数,从而产生2 ^ 32 - 62.

答案 2 :(得分:2)

将内容变量强制转换为(int)或(unsigned int)时,您将其转换为32位宽的数据类型。因此,您正在读取的字节(看起来等于二进制的11000010)变为11111111 11111111 11111111 11000010.当读取为int时,它等于-62,当读取为unsigned int时,它等于4294967234

答案 3 :(得分:1)

这里有点猜测,但我想这是由于系统存储整数的方式。 无符号整数的最大值是4294967295.您的值非常接近(实际上,差值为61)。所以我想通过将它转换为unsigned int,你使用减号为2 ^ 31。

[编辑]

2 ^ 31中的错字

答案 4 :(得分:1)

设置值中的最高位,以便在有符号值时将其解释为负数。那是-62。无符号时,它被视为非常大的正值。它大于256,因为你将它转换为更大的二进制文件。有关详细说明,请参阅“twos complement