about_Numeric_Literals
Deskripsi singkat
Artikel ini menguraikan sintaksis dan penggunaan nilai numerik di PowerShell.
Deskripsi panjang
Ada dua jenis literal numerik: bilangan bulat dan nyata. Keduanya dapat memiliki akhiran jenis dan pengali.
Literal integer
Literal bilangan bulat dapat ditulis dalam notasi desimal, heksadesimal, atau biner.
Literal heksadesimal diawali dengan 0x
dan literal biner diawali dengan 0b
untuk membedakannya dari angka desimal.
Literal bilangan bulat dapat memiliki akhiran jenis dan akhiran pengali.
Akhiran | Makna | Catatan |
---|---|---|
y |
tipe data byte yang ditandatangani | Ditambahkan di PowerShell 6.2 |
uy |
tipe data byte yang tidak ditandatangani | Ditambahkan di PowerShell 6.2 |
s |
jenis data pendek | Ditambahkan di PowerShell 6.2 |
us |
tipe data pendek yang tidak ditandatangani | Ditambahkan di PowerShell 6.2 |
l |
tipe data panjang | |
u |
tipe data int atau panjang yang tidak ditandatangani | Ditambahkan di PowerShell 6.2 |
ul |
tipe data panjang yang tidak ditandatangani | Ditambahkan di PowerShell 6.2 |
n |
Jenis data BigInteger | Ditambahkan di PowerShell 7.0 |
kb |
pengali kilobyte | |
mb |
pengali megabyte | |
gb |
pengali gigabyte | |
tb |
pengali terabyte | |
pb |
pengali petabyte |
Jenis literal bilangan bulat ditentukan oleh nilainya, akhiran jenis, dan akhiran pengali numerik.
Untuk bilangan bulat literal tanpa akhiran jenis:
- Jika nilai dapat diwakili oleh jenis
[int]
, itu adalah jenisnya. - Jika tidak, jika nilai dapat diwakili oleh jenis
[long]
, itu adalah jenisnya. - Jika tidak, jika nilai dapat diwakili oleh jenis
[decimal]
, itu adalah jenisnya. - Jika tidak, itu diwakili oleh jenis
[double]
.
Untuk bilangan bulat literal dengan akhiran jenis:
- Jika akhiran jenis adalah
u
dan nilai dapat diwakili oleh jenis[uint]
maka jenisnya adalah[uint]
. - Jika akhiran jenis adalah
u
dan nilai dapat diwakili oleh jenis[ulong]
maka jenisnya adalah[ulong]
. - Jika nilainya dapat diwakili oleh jenis yang ditentukan maka itu adalah jenisnya.
- Jika tidak, harfiah itu salah bentuk.
Harfiah yang nyata
Literal nyata hanya dapat ditulis dalam notasi desimal. Notasi ini dapat mencakup nilai pecahan setelah titik desimal dan notasi ilmiah menggunakan bagian eksponensial.
Bagian eksponensial mencakup 'e' diikuti dengan tanda opsional (+/-) dan angka yang mewakili eksponen. Misalnya, nilai 1e2
harfiah sama dengan nilai numerik 100.
Literal nyata dapat memiliki akhiran jenis dan akhiran pengali.
Akhiran | Makna |
---|---|
d |
tipe data desimal |
kb |
pengali kilobyte |
mb |
pengali megabyte |
gb |
pengali gigabyte |
tb |
pengali terabyte |
pb |
pengali petabyte |
Ada dua jenis harfiah nyata: ganda dan desimal. Ini ditunjukkan oleh ketidakhadiran atau kehadiran, masing-masing, dari akhiran jenis desimal. PowerShell tidak mendukung representasi harfiah dari sebuah [float]
nilai. Literal nyata ganda memiliki jenis [double]
. Literal nyata desimal memiliki jenis [decimal]
.
Nol berikutnya di bagian pecahan dari literal nyata desimal sangat signifikan.
Jika nilai digit bagian eksponen dalam [double]
literal nyata kurang dari minimum yang [double]
didukung, nilai harfiah nyata tersebut adalah 0. Jika nilai digit bagian eksponen dalam [decimal]
literal nyata kurang dari minimum yang didukung, literal tersebut salah bentuk. Jika nilai digit bagian eksponen dalam [double]
literal atau [decimal]
nyata lebih besar dari maksimum yang didukung, literal tersebut salah bentuk.
Catatan
Sintaks memungkinkan literal nyata ganda untuk memiliki akhiran jenis panjang.
PowerShell memperlakukan kasus ini sebagai bilangan bulat literal yang nilainya diwakili oleh jenis [long]
. Fitur ini telah dipertahankan untuk kompatibilitas mundur dengan versi PowerShell yang lebih lama. Namun, programmer tidak dianjurkan untuk menggunakan literal bilangan bulat dari bentuk ini karena mereka dapat dengan mudah mengaburkan nilai aktual literal. Misalnya, 1.2L
memiliki nilai 1, 1.2345e1L
memiliki nilai 12, dan 1.2345e-5L
memiliki nilai 0, tidak satu pun yang langsung jelas.
Pengali numerik
Untuk kenyamanan, bilangan bulat dan literal nyata dapat berisi pengali numerik, yang menunjukkan salah satu set kekuatan yang umum digunakan 2. Pengali numerik dapat ditulis dalam kombinasi huruf besar atau kecil apa pun.
Akhiran pengali dapat digunakan dalam kombinasi dengan akhiran jenis apa pun, tetapi harus ada setelah akhiran jenis. Misalnya, literal 100gbL
salah bentuk, tetapi harfiahnya 100Lgb
valid.
Jika pengali membuat nilai yang melebihi nilai yang mungkin untuk jenis numerik yang ditentukan akhiran, literal salah format. Misalnya, literal 1usgb
salah bentuk, karena nilainya 1gb
lebih besar dari apa yang diizinkan untuk [ushort]
jenis yang ditentukan oleh akhiran us
.
Contoh pengali
PS> 1kb
1024
PS> 1.30Dmb
1363148.80
PS> 0x10Gb
17179869184
PS> 1.4e23tb
1.5393162788864E+35
PS> 0x12Lpb
20266198323167232
Akselerator jenis numerik
PowerShell mendukung jenis akselerator berikut:
Accelerator | Catatan | Deskripsi |
---|---|---|
[byte] |
Byte (tidak ditandatangani) | |
[sbyte] |
Byte (ditandatangani) | |
[Int16] |
bilangan bulat 16-bit | |
[short] |
alias untuk [int16] |
bilangan bulat 16-bit |
[UInt16] |
Bilangan bulat 16-bit (tidak ditandatangani) | |
[ushort] |
alias untuk [uint16] |
Bilangan bulat 16-bit (tidak ditandatangani) |
[Int32] |
bilangan bulat 32-bit | |
[int] |
alias untuk [int32] |
bilangan bulat 32-bit |
[UInt32] |
Bilangan bulat 32-bit (tidak ditandatangani) | |
[uint] |
alias untuk [uint32] |
Bilangan bulat 32-bit (tidak ditandatangani) |
[Int64] |
bilangan bulat 64-bit | |
[long] |
alias untuk [int64] |
bilangan bulat 64-bit |
[UInt64] |
Bilangan bulat 64-bit (tidak ditandatangani) | |
[ulong] |
alias untuk [uint64] |
Bilangan bulat 64-bit (tidak ditandatangani) |
[bigint] |
Lihat BigInteger Struct | |
[single] |
Titik mengambang presisi tunggal | |
[float] |
alias untuk [single] |
Titik mengambang presisi tunggal |
[double] |
Titik mengambang presisi ganda | |
[decimal] |
Titik mengambang 128-bit |
Catatan
Jenis akselerator berikut ditambahkan di PowerShell 6.2: [short]
, , [ushort]
[uint]
, [ulong]
.
Contoh
Tabel berikut berisi beberapa contoh literal numerik dan mencantumkan jenis dan nilainya:
Angka | Tipe | Nilai |
---|---|---|
100 | Int32 | 100 |
100u | UInt32 | 100 |
100D | Decimal | 100 |
100l | Int64 | 100 |
100uL | UInt64 | 100 |
100us | UInt16 | 100 |
100uy | Byte | 100 |
100y | SByte | 100 |
1e2 | Laju | 100 |
1.e2 | Laju | 100 |
0x1e2 | Int32 | 482 |
0x1e2L | Int64 | 482 |
0x1e2D | Int32 | 7725 |
482D | Decimal | 482 |
482gb | Int64 | 517543559168 |
482ngb | BigInteger | 517543559168 |
0x1e2lgb | Int64 | 517543559168 |
0b1011011 | Int32 | 91 |
0xFFFFs | Int16 | -1 |
0xFFFFFFFF | Int32 | -1 |
-0xFFFFFFFF | Int32 | 1 |
0xFFFFFFFFu | UInt32 | 4294967295 |
Bekerja dengan angka biner atau heksadesimal
Literal biner atau heksadesimal yang terlalu besar dapat kembali sebagai [bigint]
alih-alih mengalihkan penguraian, jika dan hanya jika n
akhiran ditentukan. Bit tanda masih dihormati di atas rentang bahkan [decimal]
, namun:
- Jika string biner adalah beberapa kelipatan 8 bit panjangnya, bit tertinggi diperlakukan sebagai bit tanda.
- Jika string heksa, yang memiliki panjang kelipatan 8, memiliki digit pertama dengan 8 atau lebih tinggi, angka diperlakukan sebagai negatif.
Menentukan akhiran yang tidak ditandatangani pada literal biner dan hex mengabaikan bit tanda. Misalnya, 0xFFFFFFFF
mengembalikan -1
, tetapi 0xFFFFFFFFu
mengembalikan [uint]::MaxValue
4294967295.
Di PowerShell 7.1, menggunakan akhiran jenis pada hex literal sekarang mengembalikan nilai yang ditandatangani dari jenis tersebut. Misalnya, di PowerShell 7.0 ekspresi 0xFFFFs
mengembalikan kesalahan karena nilai positif terlalu besar untuk jenis [int16]
.
PowerShell 7.1 menafsirkan ini karena -1
itu adalah [int16]
jenis.
Awalan harfiah dengan surat wasiat 0
melewati ini dan diperlakukan sebagai tidak ditandatangani.
Misalnya: 0b011111111
. Ini dapat diperlukan ketika bekerja dengan literal dalam [bigint]
rentang, karena akhiran u
dan n
tidak dapat digabungkan.
Anda juga dapat meniadakan literal biner dan hex menggunakan awalan -
. Ini dapat mengakibatkan angka positif karena bit tanda diizinkan.
Bit tanda diterima untuk angka dengan akhiran BigInteger:
- Hex dengan akhiran BigInteger memperlakukan bit tinggi dari literal apa pun dengan panjang kelipatan 8 karakter sebagai bit tanda. Panjangnya tidak termasuk awalan
0x
atau akhiran apa pun. - Biner dengan akhiran BigInteger menerima bit tanda pada 96 dan 128 karakter, dan pada setiap 8 karakter setelahnya.
Konversi jenis numerik
Ketika string dikonversi ke angka, indikator format heksadesimal tambahan didukung. Format tambahan tersebut tidak dikenali sebagai harfiah.
[int] '0xF' -eq 0xF
[int] '&hF' -eq 0xF
[int] '#F' -eq 0xF
[int] '0b1111' -eq 0b1111
[int] '0b1111' -eq 15
Perintah yang terlihat seperti literal numerik
Perintah apa pun yang terlihat seperti literal numerik yang valid harus dijalankan menggunakan operator panggilan (&
), jika tidak, perintah tersebut ditafsirkan sebagai angka. Literal cacat dengan sintaks yang valid seperti 1usgb
akan mengakibatkan kesalahan berikut:
PS> 1usgb
At line:1 char:6
+ 1usgb
+ ~
The numeric constant 1usgb is not valid.
+ CategoryInfo : ParserError: (:) [], ParentContainsErrorRecordException
+ FullyQualifiedErrorId : BadNumericConstant
Namun, literal cacat dengan sintaks yang tidak valid seperti 1gbus
akan ditafsirkan sebagai string telanjang standar, dan dapat ditafsirkan sebagai nama perintah yang valid dalam konteks di mana perintah dapat dipanggil.
Mengakses properti dan metode objek numerik
Untuk mengakses anggota harfiah numerik, ada kasus ketika Anda perlu mengapit literal dalam tanda kurung.
- Harfiah tidak memiliki titik desimal
- Literal tidak memiliki digit apa pun setelah titik desimal
- Literal tidak memiliki akhiran
Misalnya, contoh berikut gagal:
PS> 2.GetType().Name
At line:1 char:11
+ 2.GetType().Name
+ ~
An expression was expected after '('.
+ CategoryInfo : ParserError: (:) [], ParentContainsErrorRecordException
+ FullyQualifiedErrorId : ExpectedExpression
Contoh berikut berfungsi:
PS> 2uL.GetType().Name
UInt64
PS> 1.234.GetType().Name
Double
PS> (2).GetType().Name
Int32
Dua contoh pertama berfungsi tanpa menyertakan nilai harfiah dalam tanda kurung karena pengurai PowerShell dapat menentukan di mana harfiah numerik berakhir dan metode GetType dimulai.
Cara PowerShell mengurai literal numerik
PowerShell v7.0 mengubah cara literal numerik diurai untuk mengaktifkan fitur baru.
Mengurai literal numerik nyata
Jika literal berisi titik desimal atau e-notasi, string harfiah diurai sebagai angka riil.
- Jika akhiran desimal ada, maka langsung ke .
[decimal]
- Lain, urai sebagai
[Double]
dan terapkan pengali ke nilai . Kemudian periksa akhiran jenis dan coba transmisikan ke jenis yang sesuai. - Jika string tidak memiliki akhiran jenis, maka uraikan sebagai
[Double]
.
Mengurai literal numerik bilangan bulat
Literal jenis bilangan bulat diurai menggunakan langkah-langkah berikut:
- Menentukan format radiks
- Untuk format biner, uraikan ke dalam
[BigInteger]
. - Untuk format heksadesimal, urai ke dalam
[BigInteger]
menggunakan casies khusus untuk mempertahankan perilaku asli saat nilai berada dalam[int]
rentang atau[long]
. - Jika bukan biner atau hex, urai biasanya sebagai
[BigInteger]
.
- Untuk format biner, uraikan ke dalam
- Terapkan nilai pengali sebelum mencoba transmisi apa pun untuk memastikan batas jenis dapat diperiksa dengan tepat tanpa luapan.
- Periksa akhiran jenis.
- Periksa batas jenis dan coba uraikan ke dalam jenis tersebut.
- Jika tidak ada akhiran yang digunakan, maka nilai diperiksa terikat dalam urutan berikut, menghasilkan pengujian pertama yang berhasil menentukan jenis angka.
[int]
[long]
[decimal]
(hanya 10 literal dasar)[double]
(hanya 10 literal dasar)
- Jika nilai berada di luar
[long]
rentang untuk hex dan angka biner, penguraian gagal. - Jika nilai berada di luar
[double]
rentang untuk nomor dasar 10, penguraian gagal. - Nilai yang lebih tinggi harus ditulis secara eksplisit menggunakan akhiran
n
untuk mengurai literal sebagaiBigInteger
.
Mengurai literal nilai besar
Sebelumnya, nilai bilangan bulat yang lebih tinggi diurai sebagai dua kali lipat sebelum dilemparkan ke jenis lain. Ini mengakibatkan hilangnya presisi dalam rentang yang lebih tinggi. Contohnya:
PS> [bigint]111111111111111111111111111111111111111111111111111111
111111111111111100905595216014112456735339620444667904
Untuk menghindari masalah ini, Anda harus menulis nilai sebagai string lalu mengonversinya:
PS> [bigint]'111111111111111111111111111111111111111111111111111111'
111111111111111111111111111111111111111111111111111111
Di PowerShell 7.0 Anda harus menggunakan akhiran N
.
PS> 111111111111111111111111111111111111111111111111111111n
111111111111111111111111111111111111111111111111111111
Juga nilai antara [ulong]::MaxValue
dan [decimal]::MaxValue
harus ditandai menggunakan akhiran desimal D
untuk mempertahankan akurasi. Tanpa akhiran, nilai-nilai ini diurai seperti [Double]
menggunakan mode penguraian nyata.