C # định dạng ngắn / dài / int?


174

Trong C / C # / v.v. bạn có thể nói với trình biên dịch rằng một số bằng chữ không phải là số có vẻ như (nghĩa là, floatthay vì double, unsigned longthay vì int:

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

Vân vân.

Ai đó có thể chỉ cho tôi một danh sách trong số này? Tôi đặc biệt tìm kiếm một hậu tố cho shorthoặc Int16.




Nói về một loạt các câu trả lời ... Upvotes cho tất cả mọi người.
3Dave

Câu trả lời:


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

Tôi nghĩ đó là tất cả ... không có chỉ định theo nghĩa đen cho short / ushort / byte / sbyte


9
Điều này có nghĩa là bạn phải truyền ở mọi nơi bạn sử dụng short / ushort / byte / sbyte? Ví dụ: somitherte = somebool? (byte) 1: (byte) 0;
mola

3
@mola, vâng, trừ khi loại mong muốn không rõ ràng (ví dụ byte b = 42;)
Thomas Levesque

2
@molasomebyte = (byte)(somebool ? 1 : 0);
hoặc hor

2
Chỉ cần thêm chữ hoa và chữ thường của các hậu tố theo nghĩa đen này là tương đương, ví dụ 1l1Lcả hai sẽ được coi là số nguyên dài nhưng chắc chắn 1Llà dễ đọc hơn 1l.
RBT

1
@DzmitryLahoda nghĩa là gì? Các hậu tố được thảo luận trong vấn đề đó chưa được thực hiện.
Thomas Levesque

40

Từ §2.4.4.2 Số nguyên bằng chữ :

Loại của một số nguyên được xác định như sau:

  • Nếu theo nghĩa đen không có hậu tố, nó có là người đầu tiên của các loại, trong đó giá trị của nó có thể được biểu: int, uint, long, ulong.
  • Nếu theo nghĩa đen được kèm theo cụm Uhay u, nó có là người đầu tiên của các loại, trong đó giá trị của nó có thể được biểu: uint, ulong.
  • Nếu theo nghĩa đen được kèm theo cụm Lhay l, nó có là người đầu tiên của các loại, trong đó giá trị của nó có thể được biểu: long, ulong.
  • Nếu theo nghĩa đen được kèm theo cụm UL, Ul, uL, ul, LU, Lu, lU, hay lu, nó là loại ulong.

Và từ §2.4.4.3 Nghĩa đen thực sự :

Nếu không có hậu tố loại thực được chỉ định, loại chữ thực sự là gấp đôi. Mặt khác, hậu tố loại thực xác định loại của chữ thực, như sau:

  • Một nghĩa đen thực sự có hậu tố của Fhoặc flà loại float. Ví dụ, literals 1f, 1.5f, 1e10f, và 123.456Flà tất cả các loại float.
  • Một nghĩa đen thực sự có hậu tố của Dhoặc dlà loại double. Ví dụ, literals 1d, 1.5d, 1e10d, và 123.456Dlà tất cả các loại double.
  • Một nghĩa đen thực sự có hậu tố của Mhoặc mlà loại decimal. Ví dụ, literals 1m, 1.5m, 1e10m, và 123.456Mlà tất cả các loại decimal. Chữ này được chuyển đổi thành giá trị thập phân bằng cách lấy giá trị chính xác và, nếu cần, làm tròn đến giá trị đại diện gần nhất bằng cách sử dụng làm tròn của ngân hàng (Mục 4.1.7). Bất kỳ tỷ lệ rõ ràng nào trong chữ đều được bảo tồn trừ khi giá trị được làm tròn hoặc giá trị bằng 0 (trong trường hợp sau, dấu và tỷ lệ sẽ là 0). Do đó, nghĩa đen 2.900msẽ được phân tích cú pháp để tạo thành số thập phân với dấu 0, hệ số 2900và tỷ lệ 3.

9

Nếu biến của bạn chưa phải là ngắn, bạn phải bỏ nó một cách rõ ràng:

Object s = (Int16) 1;

5
Lưu ý bên lề: Tôi nghĩ rằng điều này gây ra một chuyển đổi đấm bốc.
3Dave

6
Nó gây ra quyền anh vì Int16 là loại giá trị và Object là loại tham chiếu.
Scott Marcus

3

Không có một cho ngắn. Chỉ cần sử dụng short s = 1;.


2
Điều thú vị là biên dịch này: short z1 = (0 == 1 ? 0 : 1); Nhưng điều này không: short y = 1; short z2 = (0 == 1 ? 0 : y);(xin lỗi, không có ngắt dòng trong nhận xét)
yoyo

3
@yoyo: Đó là bởi vì 0trong nhánh if được chuyển đổi thành int trước khi gán z2. Nếu bạn sử dụng hai shorts trong các nhánh của mình, kết quả sẽ lại là a short. Với if / other, trình biên dịch không thể biết rằng bạn intcó thể được biểu diễn dưới dạng short.
Oliver
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.