C # short / long / int 리터럴 형식?


174

C / C 번호 / 등에서 당신은 문자 번호 (가로 보이는 아니라고 컴파일러를 말할 수있는, 즉. float대신 double, unsigned long대신 int:

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

기타

누군가 나에게 이것들의 목록을 지적 할 수 있습니까? short또는 에 대한 접미사를 찾고 Int16있습니다.




여러 가지 반응에 대해 이야기하십시오 ... 모두를위한 공감대.
3Dave

답변:


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
@mola, 그래, 원하는 형식은 모호하지 않는 한 (예 byte b = 42;)
토마스 레베

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

2
그냥 대문자 이러한 문자 접미사 소문자 동등한 예를 들어 것을 추가 1l하고 1L모두가 긴 정수로 취급되지만 확실히 1L보다 더 읽을 수 있습니다 1l.
RBT

1
D 이 문제에서 논의 된 접미사는 아직 구현되지 않았습니다.
토마스 레베 스크

40

§2.4.4.2 부터 정수 리터럴 :

정수 리터럴의 유형은 다음과 같이 결정됩니다.

  • 리터럴 접미사가없는 경우, 그것의 값이 표현 될 수있는 이러한 유형의 첫 번째가 : int, uint, long, ulong.
  • 리터럴에 U또는 접미사가 붙으면 u값을 나타낼 수있는 다음 유형 중 첫 번째 유형을 갖습니다. uint, ulong.
  • 리터럴에 L또는 접미사가 붙으면 l값을 나타낼 수있는 다음 유형 중 첫 번째 유형을 갖습니다. long, ulong.
  • 리터럴이 접미사로되어있는 경우 UL, Ul, uL, ul, LU, Lu,lU , 또는 lu, 그것은 타입이다 ulong.

그리고 §2.4.4.3 실시간 리터럴 :

실수 형식 접미사가 지정되지 않으면 실수 리터럴의 형식은 두 배입니다. 그렇지 않으면 실수 형식 접미사는 다음과 같이 실수 리터럴의 형식을 결정합니다.

  • 접미사가 F또는 f형식 인 실제 리터럴 float입니다. 예를 들어, 리터럴 1f, 1.5f,1e10f , 및 123.456F모든 유형입니다 float.
  • 접미사가 D또는 d형식 인 실제 리터럴 double입니다. 예를 들어, 리터럴 1d, 1.5d,1e10d , 및 123.456D모든 유형입니다 double.
  • 접미사가 M또는 m형식 인 실제 리터럴 decimal입니다. 예를 들어, 리터럴 1m, 1.5m, 1e10m, 및 123.456M모든 유형입니다 decimal. 이 리터럴은 정확한 값을 취하고 필요에 따라 은행가의 반올림을 사용하여 가장 가까운 표현 가능한 값으로 반올림하여 10 진수 값으로 변환됩니다 (4.1.7 단원). 값이 반올림되거나 값이 0이 아니면 리터럴에 표시된 모든 스케일이 유지됩니다 (후자의 경우 부호와 스케일이 0 임). 따라서 리터럴 2.900m은 구문 분석되어 sign 0, coefficient 2900및 scale과 함께 10 진수를 형성합니다 3.

9

변수가 아직 짧지 않은 경우 명시 적으로 캐스팅해야합니다.

Object s = (Int16) 1;

5
참고 : 이로 인해 권투 변환이 발생한다고 생각합니다.
3Dave

6
Int16은 값 형식이고 Object는 참조 형식이므로 boxing이 발생합니다.
Scott Marcus

3

한마디도 없습니다. 그냥 사용하십시오 short s = 1;.


2
흥미롭게도 이것은 컴파일합니다 : short z1 = (0 == 1 ? 0 : 1); 그러나 이것은하지 않습니다 : short y = 1; short z2 = (0 == 1 ? 0 : y);(죄송합니다, 의견에 줄 바꿈이 허용되지 않습니다)
yoyo

3
@yoyo : 0if 분기가 에 할당 int 하기 전에 로 변환 되기 때문 z2입니다. 가지에 두 개의를 사용 short하면 결과는 다시가됩니다 short. if / else를 사용하면 컴파일러 int는로 표현 될 수 있음을 알 수 없습니다 short.
Oliver
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.