รูปแบบตัวอักษรสั้น / ยาว / int C #?


174

ใน C / C # / ฯลฯ คุณสามารถบอกคอมไพเลอร์ที่ว่าจำนวนที่แท้จริงไม่ได้เป็นสิ่งที่มันดูเหมือนจะเป็น (เช่น. floatแทนdouble, unsigned longแทนint:

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

เป็นต้น

ใครช่วยชี้ให้ฉันดูรายการเหล่านี้ ฉันมองหาเฉพาะคำต่อท้ายสำหรับหรือshortInt16




พูดคุยเกี่ยวกับคำตอบที่วุ่นวาย ... โหวตขึ้นสำหรับทุกคน
3

คำตอบ:


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

ฉันคิดว่านั่นคือทั้งหมด ... ไม่มีตัวระบุที่แท้จริงสำหรับ short / ushort / byte / sbyte


10
นี่หมายความว่าคุณต้องส่งทุกที่ที่คุณใช้ short / ushort / byte / sbyte หรือไม่? เช่น: somebyte = somebool? (ไบต์) 1: (ไบต์) 0;
mola

3
@ โมลาใช่เว้นแต่ประเภทที่ต้องการนั้นไม่คลุมเครือ (เช่นbyte b = 42;)
Thomas Levesque

2
@molasomebyte = (byte)(somebool ? 1 : 0);
หรือ hor

2
เพียงเพื่อเพิ่มว่ากรณีกรณีบนและล่างของคำต่อท้ายตัวอักษรเหล่านี้จะเทียบเท่าเช่น1lและ1Lทั้งสองจะถือว่าเป็นจำนวนเต็มยาว แต่ก็สามารถอ่านได้มากกว่า1L 1l
RBT

1
@DzmitryLahoda คุณหมายถึงอะไร? ส่วนต่อท้ายที่กล่าวถึงในปัญหานั้นยังไม่ได้นำมาใช้
โทมัสเลวีส

40

จาก§2.4.4.2ตัวอักษรจำนวนเต็ม :

ชนิดของตัวอักษรจำนวนเต็มถูกกำหนดดังนี้:

  • intถ้าตัวอักษรไม่ได้มีคำต่อท้ายก็มีครั้งแรกของประเภทนี้ที่คุ้มค่าสามารถแสดง: uint, long, ulong,
  • หากตัวอักษรต่อท้ายด้วยUหรือuมันมีประเภทแรกที่ค่าของมันสามารถเป็นตัวแทน: uint, ulong.
  • หากตัวอักษรต่อท้ายด้วยLหรือlมันมีประเภทแรกที่ค่าของมันสามารถเป็นตัวแทน: long, ulong.
  • ถ้าตัวอักษรจะ suffixed โดยUL, Ul, uL, ul, LU, Lu, lUหรือมันเป็นประเภทluulong

และจาก§2.4.4.3ตัวอักษรจริง :

หากไม่ได้ระบุคำต่อท้ายประเภทจริงประเภทของตัวอักษรจริงจะเป็นสองเท่า มิฉะนั้นคำต่อท้ายชนิดจริงจะกำหนดชนิดของตัวอักษรจริงดังต่อไปนี้:

  • ตัวอักษรจริง suffixed โดยFหรือเป็นประเภทf floatยกตัวอย่างเช่นตัวอักษร1f, 1.5f, 1e10fและมีทุกประเภท123.456Ffloat
  • ตัวอักษรจริง suffixed โดยDหรือเป็นประเภทd doubleยกตัวอย่างเช่นตัวอักษร1d, 1.5d, 1e10dและมีทุกประเภท123.456Ddouble
  • ตัวอักษรจริง suffixed โดยMหรือเป็นประเภทm decimalยกตัวอย่างเช่นตัวอักษร1m, 1.5m, 1e10mและมีทุกประเภท123.456M decimalตัวอักษรนี้ถูกแปลงเป็นค่าทศนิยมโดยการรับค่าที่แน่นอนและหากจำเป็นให้ปัดเศษเป็นค่าที่สามารถแทนได้ที่ใกล้ที่สุดโดยใช้การปัดเศษของนายธนาคาร (มาตรา 4.1.7) สเกลใด ๆ ที่ปรากฏในตัวอักษรจะได้รับการเก็บรักษาไว้เว้นแต่ว่าค่าจะถูกปัดเศษหรือค่าเป็นศูนย์ (ซึ่งในกรณีหลังเครื่องหมายและสเกลจะเป็น 0) ดังนั้นที่แท้จริง2.900mจะถูกแยกไปในรูปแบบทศนิยมที่มีสัญลักษณ์0สัมประสิทธิ์และเครื่องชั่งน้ำหนัก29003

9

หากตัวแปรของคุณยังไม่สั้นคุณต้องทำการแปลงอย่างชัดเจน:

Object s = (Int16) 1;

5
หมายเหตุด้านข้าง: ฉันคิดว่านี่เป็นสาเหตุของการเปลี่ยนมวย
3Dave

6
มันทำให้มวยเนื่องจาก Int16 เป็นประเภทค่าและวัตถุเป็นประเภทอ้างอิง
Scott Marcus

3

ไม่มีหนึ่งสั้น short s = 1;ใช้เพียงแค่


2
ที่น่าสนใจ compiles นี้short z1 = (0 == 1 ? 0 : 1); แต่ตอนนี้ไม่ได้: short y = 1; short z2 = (0 == 1 ? 0 : y);(ขออภัยไม่มีการแบ่งบรรทัดได้รับอนุญาตในการแสดงความคิดเห็น)
yoyo

3
@yoyo: นั่นเป็นเพราะ0ในสาขาถ้าจะแปลงไปเป็นint ก่อนที่จะz2มอบหมายให้ หากคุณใช้สองในสาขาของคุณอีกครั้งผลที่ได้จะเป็นshort shortด้วยหาก / อื่นคอมไพเลอร์ไม่สามารถรู้ว่าคุณสามารถแสดงเป็นint short
โอลิเวอร์
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.