十六进制到十进制转换 - PowerShell 5

问题描述 投票:0回答:3

由于某种原因,当将 PowerShell 中的某些值从十六进制转换为十进制时,我得到了不正确的值。

例如: - 输入

0xC0000000
然后按 Enter 键,您会得到
-1073741824
,这是不正确的,正确的值为
3221225472
。给出的答案是我输入的负十六进制数的值
FFFFFFFFC0000000

我认为这可能是一个解释问题,所以我明确要求将值从十六进制转换为 Base10(十进制),我仍然得到相同的错误答案

-1073741824

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

为什么 PowerShell 将

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

powershell hex
3个回答
10
投票

这是一个 PowerShell 陷阱(也存在于早期版本中)。当您实际上希望它是无符号整数时,该值会被解释为有符号整数。您需要进行这样的转换才能解决该问题:

[uint32]"0xC0000000"

3
投票

Ansgar 已经提供了解决方法,但是有关正在发生的事情的一些解释可能会令人感兴趣。

造成这种现象的根本原因是二进制系统造成的。它实际上没有负数的概念。只有位:一系列的 1 和 0。为了将数字解释为正数或负数,发明了创造性的技巧

您的情况是这样的

0xC <=> 12dec <=> 1100 bin
。因此,由于第一位是 1,位模式被解释为负值,并且您得到
-1073741824
作为结果。顺便说一句,这就是为什么某些 Windows 错误消息包含无意义的负错误代码的原因。


0
投票

因为我讨厌加速器:

$Hex="0x18"
[System.Convert]::ToInt32($Hex,16)
24

$Hex="18"
[System.Convert]::ToInt32($Hex,16)
24
© www.soinside.com 2019 - 2024. All rights reserved.