sourcecode

가장 작은 int인 -2147483648의 유형이 '롱'인 이유는 무엇입니까?

copyscript 2022. 8. 29. 22:19
반응형

가장 작은 int인 -2147483648의 유형이 '롱'인 이유는 무엇입니까?

학교 프로젝트에서는 C 함수 printf를 코드화해야 합니다.일이 잘 풀리고 있지만, 좋은 답을 찾을 수 없는 질문이 하나 있어서, 여기 있습니다.

printf("PRINTF(d) \t: %d\n", -2147483648);

주다gcc -Werror -Wextra -Wall

   error: format specifies type 'int' but the argument has type 'long'
      [-Werror,-Wformat]
        printf("PRINTF(d) \t: %d\n", -2147483648);
                              ~~     ^~~~~~~~~~~
                              %ld

그러나 int 변수를 사용하면 모든 것이 정상적으로 진행됩니다.

int i;

i = -2147483648;
printf("%d", i);

왜요?

편집:

저는 많은 점을 이해했고, 그것들은 매우 흥미로웠습니다. 쨌,, 내 anyway ?printf요.<stdarg.h> 등 »va_arg(va_list ap, type)올바른 유형도 반환해야 합니다.★★★의 %d ★★★★★★★★★★★★★★★★★」%i 「」입니다int가달 ??

식식사는,-2147483648A정수 상수가 아닙니다. 2147483648어쩔 수 없는 정수 상수이고, 정수 상수입니다.-단지는 단항 연산자 그것에 지원하면서 일정한 표현된다.단항 연산자일 뿐이고,수 있습니다 얻을일정한 식을.가치의 가치2147483648한에 맞지 않다에 잘 맞지 않나.int(이건 너무 큰,(그것은 너무 크다.2147483647있나 일반적으로 가장 큰 정수)이고 따라서 정수 형식 일반적으로가장큰 정수)이기 때문에 정수 상수에 타입이 있습니닸다.long당신의 몸을 관찰하는 문제를 야기한다.이는 관찰된 문제의원인이 됩니다.만약, 당신이의 하한에의 최저 한계로 말하고 싶은싶은 경우 언급하고 대해.int는 매크로,또는 매크로를 사용합니다를 사용한다.INT_MIN부터에서<limits.h>(휴대용 접근)또는 조심스럽게언급을 피한다 조심스럽게(휴대용 접근법)또는을 언급하는 것을 피하다.2147483648::

printf("PRINTF(d) \t: %d\n", -1 - 2147483647);

문제는 문제는 말이다는-2147483648정수 리터럴이 아닙니다. 연산자로 - 정수 " " " " 입니다.2147483648 커서 '아예'라고 할 수 intint32번입니다. 있는 하여 ""를 나타냅니다.2147483648연산자를 에, 가 '부정 연산자', '부정하다'보다.int.

이 그 을 알고 있다면int훼손하지 않고 캐스트를 합니다.

printf("PRINTF(d) \t: %d\n", (int)(-2147483648));

「32비트」를 가지는 2의 입니다.ints.

으로 휴대성을시키려면 , 「」를 .INT_MIN번호 대신, 테스트에 사용할 수 있는 2가 아닌 계산기를 어디서 찾았는지 알려주십시오.


분명히 말하면, 그 마지막 단락은 부분적으로 농담이었다. INT_MIN ' 작은'을 작은'을 뜻하는 '가장 작은'을 의미하는 것이 분명합니다.int "왜냐하면"int크기가 다양합니다.예를 들어 16비트 구현은 아직 많이 있습니다.-2를31 쓰는 것은 항상 정확하게 그 값을 의미하는 경우에만 유용합니다. 이 경우 다음과 같은 고정 크기 유형을 사용할 수 있습니다.int32_tint.

대신 10진법으로 를 쓰는 이 더 수도 있습니다.2147483648 ★★★★★★★★★★★★★★★★★」2174483648하지만 조심해야 합니다.

바와 같이 에서는 32비트2의 보완기 2의 보완기(int)(-2147483648) 않기 되어 있습니다.-2147483648나무토막,, 는 however, 는, 는, 이, 이, 습, 습, 습, 습, 습, however, however, however, however, however.(int)(-0x80000000).0x80000000로서 취급될 것이다.unsigned int(서명되지 않은 표현에 적합하기 때문에)-0x80000000명확하게 정의되어 있다(단,-효과가 없다int32비트) 및 그 결과 변환된 값입니다.unsigned int 0x80000000로.int오버플로를 수반합니다.오버플로를 방지하려면 부호 있는 유형에 16진수 상수를 캐스팅해야 합니다.(int)(-(long long)(0x80000000)).

마찬가지로 왼쪽 시프트 연산자를 사용하려면 주의해야 합니다. 1<<3132비트 이하의 32비트 시스템에서 정의되지 않은 동작입니다.ints; 이 값은 2로 평가됩니다31.int최소 33비트입니다.왜냐하면 왼쪽 시프트가k비트가 잘 정의되어 있는 경우뿐입니다.k는 left-hand 인수의 정수 타입의 비부호 비트 수보다 엄밀하게 작습니다.

1LL<<31안전합니다.long long int는 2-1을63 나타낼 수 있어야 하므로 비트사이즈는 32보다 커야 합니다.그래서 폼은

(int)(-(1LL<<31))

가 가장 읽기 쉬울 것입니다.YMMV


모든 통과 페던트에 대해 이 질문은 C 태그가 붙어 있으며 최신 C 초안(n1570.pdf)에 기재되어 있습니다.E1 << E2,어디에E1부호 있는 타입이 있습니다.이 값은 다음과 같은 경우에만 정의됩니다.E1음이 아닌E1 × 2E2"결과 유형에서 대표할 수 있다." (제6.5.7항)

이는 왼쪽 시프트 연산자의 애플리케이션이 정의되는 C++와는 다릅니다.E1음이 아닌E1 × 2E2"결과 유형의 해당 부호 없는 유형으로 나타낼있다"(제5.8항, 강조 추가).

C++에서는, 최신의 드래프트 규격에 근거해, 행선지 타입(44.7 파라.3)으로 나타낼 수 없는 경우에는, 부호 있는 정수 타입으로의 정수값의 변환을 실장 정의한다.C규격의 대응하는 단락 (제6.3.1.3항)에는 「실장 정의의 결과 또는 실장 정의의 신호가 상승한다」라고 기술되어 있다.)

언급URL : https://stackoverflow.com/questions/34724320/why-does-the-smallest-int-%e2%88%922147483648-have-type-long

반응형