有没有一种方法在PowerShell中声明一个32位无符号整数?
我正在尝试添加一个无符号整数(以0xf
开头),即0xff000000 + 0xAA
,但结果是一个负数,我希望它是0xff0000AA
。
有没有一种方法在PowerShell中声明一个32位无符号整数?
我正在尝试添加一个无符号整数(以0xf
开头),即0xff000000 + 0xAA
,但结果是一个负数,我希望它是0xff0000AA
。
目前被接受的答案中的代码在我的系统上引发了以下错误:
这是因为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"
0xff00000AA对于32位无符号整数来说太大了,应该使用uint64。
PS> [uint64]0xff00000AA
68451041450
0xff000000 + 0xAA = 0xff0000AA
,而不是 0xff00000AA
。它们都适用于 uint32。 - phuclvlong
文字(带有L
后缀)转换为[uint32]
。您不需要在[uint64]
中进行数学运算或从字符串转换。[uint32]0xff000000L + 0xAA
u
后缀用于uint32
,因此这可以变得更加简单。0xff000000u + 0xAA
我假设你的意思是 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)
0xff00000AA
就会自动转换为68451041450
,无需进行强制转换。 - SpellingD0xFF0000AA
(四个零)来获得有符号的Int32
负值(无法转换为无符号值),而问题中使用了0xFF00000AA
(五个零)来获取有符号的Int64
正值(成功地进行转换)。 - Emperor XLII