Как да декларирам 32-битово цяло число без знак?

Има ли начин да декларирате 32-битово цяло число без знак в PowerShell?

Опитвам се да добавя неподписано (започва с 0xf), т.е. 0xff000000 + 0xAA, но се оказа отрицателно число, докато искам да е 0xff0000AA.


person Patrick    schedule 16.05.2012    source източник


Отговори (4)


0xff00000AA е твърде голям за 32-битово цяло число без знак, използвайте uint64

PS> [uint64]0xff00000AA
68451041450
person Shay Levy    schedule 16.05.2012
comment
Това не отговаря на всъщност зададения въпрос, т.е. как да се декларира 32-битово цяло число без знак, като останалата част от текста предполага, че високият бит е зададен. Отговорът, даден от Pencho даже предоставя средство за това. Като се има предвид зададения въпрос, изглежда разумно да се предположи, че предоставеният пример просто има повече шестнадесетични цифри от предвиденото и не че е твърде голям за 32-битово цяло число (със знак или друго). - person Bob Reynolds; 01.03.2013
comment
0xff000000 + 0xAA = 0xff0000AA, а не 0xff00000AA. Всички те се вписват в uint32 - person phuclv; 20.04.2020

Кодът от текущо приетия отговор причинява следната грешка в моята система:

съобщение за грешка

Това е така, защото 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"
person Pencho Ilchev    schedule 16.05.2012
comment
Не получавам грешката, която описахте, и отговорът, който @Shay даде, работи добре за мен. Използване на 64-битов PSv2. Самото въвеждане на 0xff00000AA обаче автоматично преобразува в 68451041450 без необходимост от кастинг. - person SpellingD; 17.05.2012
comment
@SpellingD: Разликата е, че Pencho използва 0xFF0000AA (четири нули), за да получи Int32 отрицателна стойност със знак (която не успява да се преобразува в стойност без знак), където въпросът използва 0xFF00000AA (пет нули), за да получи Int64 положителна стойност със знак (което преобразува успешно). - person Emperor XLII; 15.07.2012
comment
Не използвайте изображения за публикуване на код или грешки. Копирайте ги в отговора. - person jpmc26; 12.08.2016

Предполагам, че сте имали предвид 0xff0000AA, тъй като, както други споменаха, 0xff00000AA е препълване.

Най-лесният начин да направите това е да конвертирате стойността от низ. Можете да използвате или System.Convert:

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

Или просто опитайте да прехвърлите низа, но в този случай трябва да поставите пред 0x:

[uint32]'0xff0000AA'

Ако, от друга страна, наистина сте искали да знаете 32-битовата неподписана част от 64-битовото число `0xff00000aa', тогава можете да направите следното:

[System.Convert]::ToUInt32([System.Convert]::ToString(0xff00000AA -band ([uint32]::MaxValue),16),16)
person Bacon Bits    schedule 22.02.2016

Най-простият начин е да прехвърлите към [uint32] от long литерал (със суфикс L). Не е нужно да правите математиката в [uint64] или да кастирате от низ

[uint32]0xff000000L + 0xAA

В PowerShell 6.2 a серия от нови суфикси са добавени, включително u суфикс за uint32, така че това може да се направи още по-просто

0xff000000u + 0xAA
person phuclv    schedule 20.04.2020