当我想编写涉及两个[unit32]变量的减法脚本时,我收到警告“错误:”对于Int32,值太大或太小。“
示例说明我看到的内容
$v1 = [uint32]([int32]::MaxValue + 1)
$v2 = [uint32]([int32]::MaxValue + 2)
$v2 - $v1
这是正常行为吗? 我该如何避免错误?
答案 0 :(得分:5)
你说得对,有点奇怪。但正确的写作方式如下,并且有效:
PS C:\> $v1 = [uint32]([int32]::MaxValue) + 1
PS C:\> $v2 = [uint32]([int32]::MaxValue) + 2
PS C:\> $v2 -$v1
1
解释是([int32]::MaxValue + 1)
没有意义。如果你分解了你的第一个做法,你可以看到转换为双倍。
PS C:\> $a = ([int32]::MaxValue + 1)
PS C:\> $a.gettype()
IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True True Double System.ValueType
真正奇怪的是,如果你只是添加一条线就可以了。
PS C:\> $v1 = [uint32]([int32]::MaxValue + 1)
PS C:\> $v2 = [uint32]([int32]::MaxValue + 2)
PS C:\> $v2 += 1
PS C:\> $v2 - $v1
2
您可以使用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
大部分时间Trace-Command
都会提供更多信息。
JP
答案 1 :(得分:2)
显然,PowerShell的算术始终是有符号的,并且如果必要,确实不会转换为下一个更大的类型。作为解决方法,您可以使用[long]
/ [Int64]
:
PS> [long]$v2-$v1
1
或者最初只是将变量声明为[long]
。