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

12

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

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

4个回答

15

目前被接受的答案中的代码在我的系统上引发了以下错误:

error message

这是因为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
2
@SpellingD:区别在于Pencho使用了0xFF0000AA(四个零)来获得有符号的Int32负值(无法转换为无符号值),而问题中使用了0xFF00000AA(五个零)来获取有符号的Int64正值(成功地进行转换)。 - Emperor XLII
1
请勿使用图像发布代码或错误信息,请将它们复制到答案中。 - jpmc26

9

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

PS> [uint64]0xff00000AA
68451041450

4
这并没有回答实际上被问到的问题,即如何声明一个无符号32位整数,并且剩余的文本暗示高位已设置。Pencho提供的答案确实提供了一种方法来实现这一点。鉴于所提出的问题,似乎合理假设所提供的示例只是具有比预期更多的十六进制数字,而不是它对于32位整数(有符号或无符号)来说“太大”了。 - Bob Reynolds
0xff000000 + 0xAA = 0xff0000AA,而不是 0xff00000AA。它们都适用于 uint32。 - phuclv

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

在PowerShell 6.2中,一系列新的后缀已经被添加,其中包括一个u后缀用于uint32,因此这可以变得更加简单。
0xff000000u + 0xAA

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)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接