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:

  1. 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].
  2. Terapkan nilai pengali sebelum mencoba transmisi apa pun untuk memastikan batas jenis dapat diperiksa dengan tepat tanpa luapan.
  3. 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 sebagai BigInteger.

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.