C # kısa / uzun / int değişmez biçim?


174

C / C # / vb size bir hazır numarası (o gibi görünen olmadığını derleyici söyleyebilirim yani. floatYerine double, unsigned longyerine int:

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

vb.

Birisi beni bunların listesine yönlendirebilir mi? Özellikle shortveya için bir sonek arıyorum Int16.




Bir cevap telaşı hakkında konuşun ... Herkes için oylar.
3Dave

Yanıtlar:


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

Bence hepsi bu kadar ... kısa / ushort / byte / sbyte için değişmez tanımlayıcı yok


10
Bu kısa / ushort / byte / sbyte kullandığınız her yere dökmeniz gerektiği anlamına mı geliyor? Ör .: somebyte = somebool? (bayt) 1: (bayt) 0;
mola

3
@mola, evet, istenen tür açık değilse (örn. byte b = 42;)
Thomas Levesque

2
@molasomebyte = (byte)(somebool ? 1 : 0);
veya hor

2
Sadece büyük harf ve bu edebi soneklerden küçük harf eşdeğer örn olduğunu eklemek 1lve 1Lhem uzun tamsayı olarak işlem görecektir ama kesinlikle 1Ldaha okunabilir 1l.
RBT

1
@DzmitryLahoda ne demek istiyorsun? Bu konuda tartışılan sonekler henüz uygulanmamıştır.
Thomas Levesque

40

Gönderen §2.4.4.2 Tamsayı değişmezleri :

Bir tam sayı değişmezinin türü aşağıdaki gibi belirlenir:

  • Değişmez bir eki olan, bu değeri temsil edilebilir ki burada bu tip ilk var int, uint, long,ulong .
  • Hazır tarafından ekli olduğu takdirde Uya da u:, bu değeri temsil edilebilir ki burada bu tip ilk sahiptir uint,ulong .
  • Hazır tarafından ekli olduğu takdirde Lya da l:, bu değeri temsil edilebilir ki burada bu tip ilk sahiptir long,ulong .
  • Değişmezi karakterleri eklenmiş ise UL, Ul, uL, ul, LU, Lu, lU, veya lu, bu tiptedir ulong.

Ve §2.4.4.3 Gerçek değişmez değerler :

Hiçbir gerçek tür soneki belirtilmezse, gerçek değişmezin türü iki katına çıkar. Aksi takdirde, gerçek tür soneki gerçek değişmezin türünü aşağıdaki gibi belirler:

  • Gerçek bir değişmez ekli Fveya ftüründe float. Örneğin, hazır 1f, 1.5f, 1e10fve 123.456Ftüm tiptedir float.
  • Gerçek bir değişmez ekli Dveya dtüründe double. Örneğin, hazır 1d, 1.5d, 1e10dve 123.456Dtüm tiptedir double.
  • Gerçek bir değişmez ekli Mveya mtüründe decimal. Örneğin, hazır 1m, 1.5m, 1e10mve 123.456Mtüm tiptedir decimal. Bu değişmez değer, kesin değer alınarak ve gerekirse bankacının yuvarlanması kullanılarak temsil edilebilir en yakın değere yuvarlanarak ondalık bir değere dönüştürülür (Bölüm 4.1.7). Değer yuvarlanmadıkça veya değer sıfır olmadığı sürece değişmezde görünen herhangi bir ölçek korunur (bu durumda işaret ve ölçek 0 olur). Böylece, değişmez 2.900mişaret 0, katsayı 2900ve ölçekle ondalık sayı oluşturmak üzere ayrıştırılacaktır 3.

9

Değişkeniniz zaten kısa değilse, açık bir şekilde yayınlamanız gerekir:

Object s = (Int16) 1;

5
Yan not: Bence bu bir boks dönüşümüne neden oluyor.
3Dave

6
Int16 bir değer türü ve nesne bir başvuru türü olduğundan, boks neden olur.
Scott Marcus

3

Kısaca bir tane yok. Sadece kullan short s = 1;.


2
İlginç bir şekilde bu derler: short z1 = (0 == 1 ? 0 : 1); Ama bu yapmaz: short y = 1; short z2 = (0 == 1 ? 0 : y);(üzgünüm, yorumlarda satır sonlarına izin verilmez)
yoyo

3
@yoyo: 0if in dalında atamadan int önce bir dönüştürülür çünkü z2. shortDallarınızda iki s kullanırsanız , sonuç yine a olur short. İf / else ile derleyici sizin intolarak temsil edilebileceğini bilemez short.
Oliver
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.