PowerShell减法是否在内部将uint32值转换为int32?

Luc*_*ucD 3 powershell powershell-2.0

当我想编写涉及两个[unit32]变量的减法脚本时,我得到了警告"错误:"对于Int32,值太大或太小."

一个样本来说明我所看到的

$v1 = [uint32]([int32]::MaxValue + 1)
$v2 = [uint32]([int32]::MaxValue + 2)
$v2 - $v1
Run Code Online (Sandbox Code Playgroud)

这是正常的行为吗?我该如何避免错误?

JPB*_*anc 5

你是对的有点奇怪.但正确的写作方式如下,它的工作原理如下:

PS C:\> $v1 = [uint32]([int32]::MaxValue) + 1
PS C:\> $v2 = [uint32]([int32]::MaxValue) + 2
PS C:\> $v2 -$v1
1
Run Code Online (Sandbox Code Playgroud)

解释是([int32]::MaxValue + 1)没有意义的.如果你分解你的第一个做法,你可以看到转换成双重.

PS C:\> $a = ([int32]::MaxValue + 1)
PS C:\> $a.gettype()

IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     True     Double                                   System.ValueType
Run Code Online (Sandbox Code Playgroud)

真奇怪的是,如果你只是添加一行它再次起作用.

PS C:\> $v1 = [uint32]([int32]::MaxValue + 1)
PS C:\> $v2 = [uint32]([int32]::MaxValue + 2)
PS C:\> $v2 += 1
PS C:\> $v2 - $v1
2
Run Code Online (Sandbox Code Playgroud)

您可以使用Cmdlet调查此类表达式Trace-Command:

PS C:\> Trace-Command -Name TypeConversion -Expression {[uint32]([int32]::MaxValue + 1)} -PSHost
DÉBOGUER : TypeConversion Information: 0 : Converting "64" to "System.Int32".
DÉBOGUER : TypeConversion Information: 0 :     Result type is assignable from value to convert's type
DÉBOGUER : TypeConversion Information: 0 : Converting "System.Object[]" to "System.Object[]".
DÉBOGUER : TypeConversion Information: 0 :     Result type is assignable from value to convert's type
DÉBOGUER : TypeConversion Information: 0 : Conversion to System.Type
DÉBOGUER : TypeConversion Information: 0 :     Conversion to System.Type
DÉBOGUER : TypeConversion Information: 0 :         Found "System.Int32" in the loaded assemblies.
DÉBOGUER : TypeConversion Information: 0 : Converting "2147483647" to "System.Double".
DÉBOGUER : TypeConversion Information: 0 :     Numeric conversion succeeded.
DÉBOGUER : TypeConversion Information: 0 : Converting "1" to "System.Double".
DÉBOGUER : TypeConversion Information: 0 :     Numeric conversion succeeded.
DÉBOGUER : TypeConversion Information: 0 : Conversion to System.Type
DÉBOGUER : TypeConversion Information: 0 :     Conversion to System.Type
DÉBOGUER : TypeConversion Information: 0 :         Found "System.UInt32" in the loaded assemblies.
DÉBOGUER : TypeConversion Information: 0 : Converting "2147483648" to "System.UInt32".
DÉBOGUER : TypeConversion Information: 0 :     Numeric conversion succeeded.
2147483648
Run Code Online (Sandbox Code Playgroud)

大多数时候Trace-Command提供更多信息.

J.P


Joe*_*oey 2

显然,PowerShell 的算术总是有符号的,并且确实在必要时不会转换为下一个更大的类型。作为解决方法,您可以使用[long]/ [Int64]

PS> [long]$v2-$v1
1
Run Code Online (Sandbox Code Playgroud)

或者只是将变量声明为 [long]初始值。