programing

sizeof (unsigned double)가 4와 같은 이유는 무엇입니까?

nasanasas 2020. 10. 28. 08:09
반응형

sizeof (unsigned double)가 4와 같은 이유는 무엇입니까?


내 동료가 서명되지 않은 이중이 있는지 물었고 그렇지 않다고 말했지만 여전히 확인했으며 이것은 Microsoft Visual C ++ 2010 에서 컴파일됩니다 .

unsigned double a;
double b;
printf("size_a=%d size_b=%d", (int) sizeof(a), (int) sizeof(b));

출력 size_a=4 size_b=8합니다. 즉,에는 4 바이트 unsigned double, double.


unsigned double유효하지 않다. 이것은 MSVC에서도 마찬가지입니다. 경고가 활성화 된 MSCV 2010에서 위 코드를 컴파일하면 다음과 같은 결과가 나타납니다.

warning C4076: 'unsigned' : can not be used with type 'double'

컴파일러는 실제로 이후를 무시 하여 실제로 .doubleunsignedaunsigned int

다음을 시도하는 경우 :

unsigned double a = 1.0;

실제로 두 가지 경고가 표시됩니다.

warning C4076: 'unsigned' : can not be used with type 'double'
warning C4244: 'initializing' : conversion from 'double' to 'unsigned int', possible loss of data

흥미롭게도 VS2010에 대한 MSDN에는 C4076 경고가 없습니다. VS2005 및 VS2008에만 존재합니다.


경고 수준을 더 높게 설정하면 (내 테스트에서 / W3) 적절한 경고가 표시됩니다.

경고 C4076 : 'unsigned': 'double'유형과 함께 사용할 수 없습니다.

그런 다음 디버거를 사용하여 변수를 검사하면 모든 것이 명확 해집니다.

여기에 이미지 설명 입력

변수가 실제로 unsigned int


선언 지정자 시퀀스에서 unsigned결합 하는 double것은 유효한 C ++가 아닙니다. 이것은 일종의 MSVC 확장 (또는 버그)이어야합니다.

일반적으로 선언 의 완전한 decl-specifier-seq 또는 type-specifier-seq 또는 trailing-type-specifier-seq 에는 최대 하나의 유형 지정자가 허용됩니다 . 이 규칙에 대한 유일한 예외는 다음과 같습니다.

  • const 자신을 제외한 모든 유형 지정자와 결합 할 수 있습니다.
  • volatile 자신을 제외한 모든 유형 지정자와 결합 할 수 있습니다.
  • signed이나 unsigned와 결합 될 수있다 char, long, short, 또는 int.
  • short이나 long와 결합 될 수있다 int.
  • long와 함께 사용할 수 있습니다 double.
  • long와 함께 사용할 수 있습니다 long.

unsigned 및 signed는 가능한 경우 MSVC에서 형식 한정자로 작동합니다 (unsigned char, signed short 등). unsigned bool 또는 signed double과 같이 그렇게 할 수없는 경우 요청 된 유형이 생성되지 않습니다. 유형은 부호없는 [int] 및 부호있는 [int]로 처리됩니다.


VS2010의 버그입니다. VS2012는 해당 코드 줄에 다음 오류를 제공합니다.

error CS1002: ; expected

';'가 필요합니다. 키워드 'double'앞에.

참고 URL : https://stackoverflow.com/questions/14977454/why-is-sizeofunsigned-double-equal-to-4

반응형