가장 작은 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
가달 ??
식식사는,-2147483648
A정수 상수가 아닙니다. 2147483648
어쩔 수 없는 정수 상수이고, 정수 상수입니다.-
단지는 단항 연산자 그것에 지원하면서 일정한 표현된다.단항 연산자일 뿐이고,수 있습니다 얻을일정한 식을.가치의 가치2147483648
한에 맞지 않다에 잘 맞지 않나.int
(이건 너무 큰,(그것은 너무 크다.2147483647
있나 일반적으로 가장 큰 정수)이고 따라서 정수 형식 일반적으로가장큰 정수)이기 때문에 정수 상수에 타입이 있습니닸다.long
당신의 몸을 관찰하는 문제를 야기한다.이는 관찰된 문제의원인이 됩니다.만약, 당신이의 하한에의 최저 한계로 말하고 싶은싶은 경우 언급하고 대해.int
는 매크로,또는 매크로를 사용합니다를 사용한다.INT_MIN
부터에서<limits.h>
(휴대용 접근)또는 조심스럽게언급을 피한다 조심스럽게(휴대용 접근법)또는을 언급하는 것을 피하다.2147483648
::
printf("PRINTF(d) \t: %d\n", -1 - 2147483647);
문제는 문제는 말이다는-2147483648
정수 리터럴이 아닙니다. 연산자로 -
정수 " " " " 입니다.2147483648
커서 '아예'라고 할 수 int
int
32번입니다. 있는 하여 ""를 나타냅니다.2147483648
연산자를 에, 가 '부정 연산자', '부정하다'보다.int
.
이 그 을 알고 있다면int
훼손하지 않고 캐스트를 합니다.
printf("PRINTF(d) \t: %d\n", (int)(-2147483648));
「32비트」를 가지는 2의 입니다.int
s.
으로 휴대성을시키려면 , 「」를 .INT_MIN
번호 대신, 테스트에 사용할 수 있는 2가 아닌 계산기를 어디서 찾았는지 알려주십시오.
분명히 말하면, 그 마지막 단락은 부분적으로 농담이었다. INT_MIN
' 작은'을 작은'을 뜻하는 '가장 작은'을 의미하는 것이 분명합니다.int
"왜냐하면"int
크기가 다양합니다.예를 들어 16비트 구현은 아직 많이 있습니다.-2를31 쓰는 것은 항상 정확하게 그 값을 의미하는 경우에만 유용합니다. 이 경우 다음과 같은 고정 크기 유형을 사용할 수 있습니다.int32_t
int
.
대신 10진법으로 를 쓰는 이 더 수도 있습니다.2147483648
★★★★★★★★★★★★★★★★★」2174483648
하지만 조심해야 합니다.
바와 같이 에서는 32비트2의 보완기 2의 보완기(int)(-2147483648)
않기 되어 있습니다.-2147483648
나무토막,, 는 however, 는, 는, 이, 이, 습, 습, 습, 습, 습, however, however, however, however, however.(int)(-0x80000000)
.0x80000000
로서 취급될 것이다.unsigned int
(서명되지 않은 표현에 적합하기 때문에)-0x80000000
명확하게 정의되어 있다(단,-
효과가 없다int
32비트) 및 그 결과 변환된 값입니다.unsigned int
0x80000000
로.int
오버플로를 수반합니다.오버플로를 방지하려면 부호 있는 유형에 16진수 상수를 캐스팅해야 합니다.(int)(-(long long)(0x80000000))
.
마찬가지로 왼쪽 시프트 연산자를 사용하려면 주의해야 합니다. 1<<31
32비트 이하의 32비트 시스템에서 정의되지 않은 동작입니다.int
s; 이 값은 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
'sourcecode' 카테고리의 다른 글
왜 numpy가 Python의 ctype보다 매트릭스 곱셈이 빠를까요? (0) | 2022.08.29 |
---|---|
c와 c++의 컨텍스트에서 static 변수, auto 변수, global 변수 및 local 변수의 차이 (0) | 2022.08.29 |
GCC -g vs -g3 GDB 플래그:차이점은 무엇입니까? (0) | 2022.08.29 |
동일한 페이지에서 서로 다른 쿼리에 vue-apollo 구성 요소 사용 (0) | 2022.08.29 |
VUE의 상위 구성 요소에서 모드 대화 상자 전환 (0) | 2022.08.29 |