回答
0xf2 = 11110010
的第一比特是符号位。所以符号是负的。要获得实际的价值,请采取2的赞美。
11110010 -> 1's complement -> 00001101 -> Add 1 -> 00001110 = -14
同样,取0xfffff...f2
。 在开头标志位。取2的补码。
1111-1111-1111.....0010 -> 1's complement -> 00000000000...1101 -> Add 1 -> 0000...1110 -> -14
任何号码的前1111...
不会有所作为为负符号数的价值,就像0000..
不会为正值。
上述计算是针对8-bit signed 0xf2
32-bit signed 0xfffffff2
这两者都是数学上等于。
完美。非常感谢! –
在Java中,0xf2是一个(32位)“int”值,而不是一个8位字节。如果你尝试'byte b = 0xf2;',你会得到一个编译错误。 –
@TedHopp这不是Java视角,而是一般。据我所知,大多数编程语言都有32位的粒度,所以它根本不是-ve数。 –
在二进制数中,当使用二进制补码时,负值将最高有效位设置为1.哪一位取决于它的位数。
0xf2
解释为8位有符号值是-14,而0xfffffff2
解释为32位有符号值是相同的-14。
32位0x000000f2
将是242,相同无符号 8位0xf2
(注:Java没有任何无符号整数类型)。
实际上,在Java中0xf2是32位的242. –
@TedHopp是的,AFAIK Java根本没有字节文字,我会编辑答案更加清晰。 – hyde
@TedHopp请问您可以给我一篇文章阅读关于此“粒度”的更多信息吗? –
这两个0xf2和0xfffffff2值如何代表-14?
他们没有。
int a = 0xf2;
int b = 0xfffffff2;
是不同的值。在那里它们代表相同的数目的唯一情况是:
byte a = (byte)0xf2;
byte b = 0xfffffff2;
那是因为符号扩展的,当一个字节是在的整数上下文中使用。请注意,
byte a = 0xf2;
甚至没有编译,所以很难看出你的问题是真的。
- 1. 在C++中将十六进制十六进制字符标记为十进制
- 2. 十六进制串&十六进制
- 3. 将十进制转换为十六进制和十六进制
- 4. 选择一个十六进制附近的十六进制数
- 5. 十六进制字符串到十六进制整数
- 6. 十六进制为十进制
- 7. 十六进制和十进制转换
- 8. 使用十进制或十六进制
- 9. Javascript十进制到十六进制
- 10. 转换十六进制到十进制
- 11. 十六进制
- 12. 十六进制
- 13. 十六进制
- 14. 十六进制到十进制转换在java中
- 15. 十六进制和十六进制十进制之间的区别
- 16. 将十六进制转换为二进制到十六进制?
- 17. VBA隐藏十进制和十六进制的负数十进制数
- 18. 十六进制为二进制和十进制在matlab中
- 19. 用于大数字的十进制到十六进制的Python
- 20. 如何比较十六进制数字与shell中的十六进制数字?
- 21. C++将十六进制字符串转换为十六进制char *十六进制数字
- 22. 解析Java中的十六进制
- 23. 转换十六进制字符串十六进制值
- 24. 将字符串转换为十六进制到十六进制
- 25. python字符串与十六进制转义十六进制值
- 26. 从十六进制到十进制,二进制到十进制和八进制到十进制程序C++
- 27. 将八进制数转换为十进制和十六进制
- 28. 十六进制,八进制,二进制到十进制(C++)
- 29. 二进制,八进制,十六进制到十进制程序
- 30. 解释十六进制值?
*两*的补码,而不是Tow的补码... – hyde
谢谢。更正 –
请注意,只有* 0xf2 == -14 * * *如果您的字大小是8位,并且类似地,0xfffffff2 == -14 *仅*对于32位字大小;除了要求使用二进制补码表示法。 – twalberg