C # pendek / panjang / format literal int?

174

Dalam C / C # / etc. Anda bisa memberi tahu kompiler bahwa angka literal tidak seperti apa yang tampak (mis., floatAlih- alih double, unsigned longbukannya int:

var d = 1.0; // double
var f = 1.0f; // float
var u = 1UL; // unsigned long

dll.

Bisakah seseorang menunjuk saya ke daftar ini? Saya secara khusus mencari akhiran untuk shortatau Int16.

3Dave
sumber
kemungkinan duplikat Mendefinisikan berbagai tipe angka di C #
Daniel Renshaw
Bicara tentang kesibukan tanggapan ... Upvotes untuk semua orang.
3Dave

Jawaban:

309
var d  = 1.0d;  // double
var d0 = 1.0;   // double
var d1 = 1e+3;  // double
var d2 = 1e-3;  // double
var f  = 1.0f;  // float
var m  = 1.0m;  // decimal
var i  = 1;     // int
var ui = 1U;    // uint
var ul = 1UL;   // ulong
var l  = 1L;    // long

Saya pikir itu saja ... tidak ada penentu literal untuk pendek / ushort / byte / sbyte

Thomas Levesque
sumber
10
Apakah ini berarti Anda harus melemparkan di mana saja Anda menggunakan short / ushort / byte / sbyte? Mis .: somebyte = somebool? (byte) 1: (byte) 0;
mola
3
@ola, ya, kecuali tipe yang diinginkan tidak ambigu (mis. byte b = 42;)
Thomas Levesque
2
@molasomebyte = (byte)(somebool ? 1 : 0);
atau hor
2
Hanya untuk menambahkan bahwa huruf besar dan huruf kecil dari sufiks literal ini setara misalnya 1ldan 1Lkeduanya akan diperlakukan sebagai bilangan bulat panjang tetapi tentu saja 1Llebih mudah dibaca daripada 1l.
RBT
1
@DzmitryLahoda apa maksudmu? Sufiks yang dibahas dalam masalah itu belum diimplementasikan.
Thomas Levesque
40

Dari §2.4.4.2 Literal integer :

Jenis literal bilangan bulat ditentukan sebagai berikut:

  • Jika literal tidak memiliki akhiran, ia memiliki pertama jenis ini yang nilainya dapat diwakili: int, uint, long, ulong.
  • Jika literal tersebut didekatkan dengan Uatau u, ia memiliki yang pertama dari jenis ini di mana nilainya dapat diwakili: uint, ulong.
  • Jika literal tersebut didekatkan dengan Latau l, ia memiliki yang pertama dari jenis ini di mana nilainya dapat diwakili: long, ulong.
  • Jika literal yang suffixed oleh UL, Ul, uL, ul, LU, Lu, lU, atau lu, itu adalah dari jenis ulong.

Dan dari §2.4.4.3 Literal nyata :

Jika tidak ada sufiks tipe nyata yang ditentukan, tipe literal sesungguhnya adalah dobel. Jika tidak, akhiran tipe nyata menentukan tipe literal nyata, sebagai berikut:

  • Sebuah literal nyata yang diakhiri dengan Fatau fbertipe float. Sebagai contoh, literal 1f, 1.5f, 1e10f, dan 123.456Fsemua jenis float.
  • Sebuah literal nyata yang diakhiri dengan Datau dbertipe double. Sebagai contoh, literal 1d, 1.5d, 1e10d, dan 123.456Dsemua jenis double.
  • Sebuah literal nyata yang diakhiri dengan Matau mbertipe decimal. Sebagai contoh, literal 1m, 1.5m, 1e10m, dan 123.456Msemua jenis decimal. Literal ini dikonversi ke nilai desimal dengan mengambil nilai yang tepat, dan, jika perlu, pembulatan ke nilai representatif terdekat menggunakan pembulatan bankir (Bagian 4.1.7). Skala apa pun yang tampak dalam literal dipertahankan kecuali nilainya dibulatkan atau nilainya nol (dalam hal ini tanda dan skala akan 0). Karenanya, literal 2.900makan diuraikan untuk membentuk desimal dengan tanda 0, koefisien 2900, dan skala 3.
BoltClock
sumber
9

Jika variabel Anda belum pendek, Anda harus memberikannya secara eksplisit:

Object s = (Int16) 1;
Chris
sumber
5
Catatan: Saya pikir ini menyebabkan konversi tinju.
3Dave
6
Itu menyebabkan tinju karena Int16 adalah tipe nilai dan Objek adalah tipe referensi.
Scott Marcus
3

Singkatnya, tidak ada satu pun. Gunakan saja short s = 1;.

Random832
sumber
2
Menariknya kompilasi ini: short z1 = (0 == 1 ? 0 : 1); Tapi ini tidak: short y = 1; short z2 = (0 == 1 ? 0 : y);(maaf, tidak ada jeda baris yang diizinkan dalam komentar)
yoyo
3
@yoyo: Itu karena 0cabang if dikonversi menjadi int sebelum penugasan z2. Jika Anda menggunakan dua shorts di cabang Anda, hasilnya akan kembali menjadi a short. Dengan if / else, kompiler tidak dapat mengetahui bahwa Anda intdapat direpresentasikan sebagai short.
Oliver