我有文件从哪里读到第一个字符 - 意思是前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!
答案 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。
答案 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”