出于某种原因,将PowerShell中的某些值从Hex转换为Decimal时,我得到的值不正确。
例如:
- 输入0xC0000000
然后按Enter键,您将获得-1073741824
这是不正确的,正确的值是3221225472
。给出的答案是我输入的负十六进制数FFFFFFFFC0000000
我认为这可能是一个解释问题所以我明确要求将值转换为Hex到Base10(十进制),我仍然得到相同的错误答案-1073741824
:
[Convert]::ToString(0xc0000000,10)
为什么PowerShell会将0xc0000000
解释为十六进制数c0000000
的否定值?我在这里错过了什么吗?
答案 0 :(得分:2)
Ansgar already provided the work-around,但对正在发生的事情的一些解释可能会引起人们的兴趣。
这种现象的根本原因是由二元系统引起的。它实际上没有负数概念。只有位:系列的1和0。为了将数字解释为正数或负数,creative trickery已被发明。
您的情况会发生0xC <=> 12dec <=> 1100 bin
。因此,当第一位为1时,位模式被解释为负值,结果得到-1073741824
。顺便说一句,这就是为什么某些Windows的错误消息包含无意义的负面错误代码。
答案 1 :(得分:1)
这是一个PowerShell陷阱(也存在于早期版本中)。当您确实希望它是无符号整数时,该值将被解释为有符号整数。您需要像这样进行转换以解决问题:
[uint32]"0xC0000000"