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

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

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

我试图添加一个无符号(以

0xf
开头),即
0xff000000 + 0xAA
,但结果是一个负数,而我希望它是
0xff0000AA

powershell 32-bit unsigned-integer
5个回答
16
投票

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

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"

9
投票

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

PS> [uint64]0xff00000AA
68451041450

2
投票

最简单的方法是从

[uint32]
文字(带有
long
后缀)转换为
L
。您不需要在
[uint64]
中进行数学计算或从字符串进行转换

[uint32]0xff000000L + 0xAA

在 PowerShell 6.2 添加了一系列新后缀,包括

u
后缀 fof
uint32
,因此可以更简单地完成

0xff000000u + 0xAA

0
投票

我假设你的意思是

0xff0000AA
,因为正如其他人提到的,
0xff00000AA
是溢出。

最简单的方法是从字符串转换值。 您可以使用

System.Convert
:

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

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

0x
:

[uint32]'0xff0000AA'

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

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

0
投票

另一种解决方法,如果您事先不知道号码:

$int = 0xff000000
$uint = [uint32]('0x{0:x}' -f $int)
$uint + 0xaa | % tostring x

ff0000aa
© www.soinside.com 2019 - 2024. All rights reserved.