2016-07-25 239 views
1

出于某种原因,将PowerShell中的某些值从十六进制转换为十进制时,出现错误值。十进制到十六进制转换 - PowerShell 5

例如: - 0xC0000000类型,然后按下回车键,你会得到-1073741824这是不正确,正确的价值是3221225472。给出的答案是我输入的负十六进制数的值FFFFFFFFC0000000

我认为这可能是一个解释问题,所以我明确要求将值从Hex转换为Base10(小数),但我仍然得到相同的错误答案-1073741824

[Convert]::ToString(0xc0000000,10) 

为什么PowerShell的解释0xc0000000为负的十六进制数c0000000?我在这里错过了什么吗?

回答

1

这是一个PowerShell问题(也存在于早期版本中)。当你真的希望它是一个无符号整数时,该值被解释为一个有符号整数。你需要做这样的转换来解决这个问题:

[uint32]"0xC0000000" 
+0

我明白了。这是有道理的。谢谢。 – RonaDona

2

安斯加尔already provided the work-around,但是这是怎么回事了一些解释可能会感兴趣。

这种现象的根本原因是二元系统造成的。它并没有真正的负数概念。只有一些:一系列和零。为了将数字解释为正数或负数,已经发明creative trickery

你的情况是0xC <=> 12dec <=> 1100 bin。因此,第一位为1时,位模式被解释为负值,因此得到-1073741824。顺便说一下,这就是为什么某些Windows错误消息包含无意义的负面错误代码的原因。

+0

这基本上是我的意思是“解释为一个有符号的整数”。 ;) –

+0

感谢您的回复。这更清楚地表明为什么有符号整数被认为是一个负数,因为我认为最左边的第16位数字是被使用的,但是在阅读完这些数字之后,我现在明白了。 Windows有时会做一些时髦的事情。 – RonaDona