【问题标题】:How to declare an unsigned 32-bit integer?如何声明一个无符号的 32 位整数?
【发布时间】:2012-05-24 11:06:55
【问题描述】:

有没有办法在 PowerShell 中声明一个 32 位无符号整数?

我正在尝试添加一个无符号(以0xf 开头),即0xff000000 + 0xAA,但结果是一个负数,而我希望它是0xff0000AA

【问题讨论】:

    标签: powershell 32-bit unsigned-integer


    【解决方案1】:

    0xff00000AA 对于 32 位无符号整数来说太大了,使用 uint64

    PS> [uint64]0xff00000AA
    68451041450
    

    【讨论】:

    • 这并没有回答 实际上 提出的问题,即如何声明一个无符号的 32 位整数,文本的其余部分暗示设置了高位。 Pencho 提供的答案确实 提供了一种方法来做到这一点。鉴于所提出的问题,假设所提供的示例具有比预期更多的十六进制数字并且 not 对于 32 位整数(有符号或其他)来说“太大”似乎是合理的。
    • 0xff000000 + 0xAA = 0xff0000AA,而不是0xff00000AA。它们都适合 uint32
    【解决方案2】:

    当前接受的答案中的代码导致我的系统出现以下错误:

    这是因为 PowerShell 总是首先尝试将十六进制值转换为 int,因此即使您转换为 uint64,如果数字具有负 int 值,环境也会抱怨。您可以从以下示例中看到这一点:

    PS C:\> [uint64] (-1)
    Cannot convert value "-1" to type "System.UInt64". Error: "Value was either too large or too small for a UInt64."
    At line:1 char:26
    + Invoke-Expression $ENUS; [uint64] (-1)
    +                          ~~~~~~~~~~~~~
        + CategoryInfo          : InvalidArgument: (:) [], RuntimeException
        + FullyQualifiedErrorId : InvalidCastIConvertible
    

    您需要将数字的字符串表示形式转换为uint64 以避免这种情况:

    [uint64]"0xff000000" + [uint64]"0xAA"
    

    【讨论】:

    • 我没有收到您描述的错误,@Shay 给出的答案对我来说很好。使用 64 位 PSv2。但是,只需输入 0xff00000AA 会自动转换为 68451041450 而无需强制转换。
    • @SpellingD:不同之处在于 Pencho 使用 0xFF0000AA(四个零)得到有符号的 Int32 负值(无法转换为无符号值),其中问题使用 0xFF00000AA (五个零)得到一个有符号的Int64 正值(转换成功)。
    • 请勿使用图片发布代码或错误。将它们复制到答案中。
    【解决方案3】:

    我假设您的意思是 0xff0000AA,因为正如其他人所提到的,0xff00000AA 是溢出。

    最简单的方法是从字符串转换值。你可以使用System.Convert:

    [System.Convert]::ToUInt32('0xff0000AA',16)
    [System.Convert]::ToUInt32('ff0000AA',16)
    

    或者只是尝试转换字符串,但在这种情况下,您需要在前面加上0x

    [uint32]'0xff0000AA'
    

    另一方面,如果您真的确实想知道 64 位数字 `0xff00000aa' 的 32 位无符号整数部分,那么您可以这样做:

    [System.Convert]::ToUInt32([System.Convert]::ToString(0xff00000AA -band ([uint32]::MaxValue),16),16)
    

    【讨论】:

      【解决方案4】:

      最简单的方法是从 long 文字(带有 L 后缀)转换为 [uint32]。您无需在 [uint64] 中进行数学运算或从字符串中转换

      [uint32]0xff000000L + 0xAA
      

      在 PowerShell 6.2 中添加了 a series of new suffixes,包括 u 后缀 fof uint32,因此可以更简单地完成此操作

      0xff000000u + 0xAA
      

      【讨论】:

        猜你喜欢
        • 2010-11-16
        • 2011-05-03
        • 1970-01-01
        • 1970-01-01
        • 2011-01-31
        • 1970-01-01
        • 1970-01-01
        • 2014-01-16
        • 2012-07-27
        相关资源
        最近更新 更多