如何声明无符号的32位整数?

时间:2012-05-16 20:22:02

标签: powershell

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

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

4 个答案:

答案 0 :(得分:11)

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

这是因为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"

答案 1 :(得分:5)

0xff00000AA对于32位无符号整数而言太大,请使用uint64

PS> [uint64]0xff00000AA
68451041450

答案 2 :(得分:0)

我假设你的意思是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)

答案 3 :(得分:0)

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

[uint32]0xff000000L + 0xAA

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

0xff000000u + 0xAA