"inti = 1;왜 (i > = 60 * 60 * 1000 / 1 * 1000)"가 참입니까?
첫째, 괄호 없이 두 개의 상수 표현을 정의하는 것은 제 잘못입니다.
#define BIG_INTERVAL 60 * 60 * 1000
#define SMALL_INTERVAL 1 * 1000
int i = 1;
if (i >= BIG_INTERVAL / SMALL_INTERVAL - 1)
{
printf("Oops!\n");
}
if
sif(i >= 60 * 60 * 1000 / 1 * 1000 - 1)
.
그것은 제 의도가 아닙니다.됩니다를 합니다.if (i >= 3600000000 - 1)
은 거짓입니다 거짓입니다.
어떤 타입인가요?60 * 60 * 1000 / 1 * 1000 - 1
?int
?
연산자int
int
요.60 * 60 * 1000 / 1 * 1000 - 1
입니다.int
는 . 3599999999 의에는 .int
, -694967297( 32 ) 로합니다.int
둘의 보어).
그대로의 이런 않습니다.3600000000
왜냐하면 정수 때문입니다.INT_MAX
전체 값을 유지할 수 있는 유형입니다.
60 * 60 * 1000 / 1 * 1000 - 1 = 3600000 * 1000 - 1, 이는 int 유형을 오버플로하므로 결과가 무엇이든 될 수 있습니다(당신의 경우에는 음수이지만 반드시 그럴 필요는 없습니다).
원하는 것을 달성하려면( ):
#define BIG_INTERVAL (60 * 60 * 1000)
#define SMALL_INTERVAL (1 * 1000)
검사 결과는 다음과 같습니다.
60 * 60 * 1000 / 1 * 1000 will result to -694967296
(60 * 60 * 1000) / (1*1000) will result to 3600
연산에 문제가 있습니다. 계산의 우선순위입니다.
C++ 연산자 우선 순위 http://msdn.microsoft.com/en-us/library/126fe14k%28v=vs.80%29.aspx 를 확인하는 것을 고려해 볼 수 있습니다.결과가 -694967296이 된 이유는 오버플로우의 효과라고 생각합니다.
int가 64비트인 컴파일러를 사용하면 식의 결과가 거짓임을 알 수 있습니다.int가 32비트 또는 16비트인 컴파일러를 사용하는 경우 서명된 int의 오버플로가 랩어라운드를 수행할 필요가 없으므로 식에 정의되지 않은 동작이 있습니다.아마 당신 것은 그냥 포장했을 거예요, 하지만 그럴 필요는 없어요.
3600000000은 컴파일 시간에 일정하게 표시되므로 int가 32비트에 불과하면 컴파일러는 long long(또는 long이 64비트인 경우 long)을 선택해야 합니다.따라서 다른 식은 오버플로를 방지하기에 충분한 비트로 평가되며, 결과는 정확합니다.
2147m 정도의 사인이 있는 인트의 크기를 넘기고 있는 것일 수도 있습니다. 즉, 그에 대한 표현을 검토하면 마이너스가 된다는 뜻입니다.다른 답변에서 지적한 바와 같이 분할은 확장할 때 아무것도 수행하지 않으므로 매크로 정의를 괄호로 둘러싸십시오.
서명된 int에 대한 유효한 값 범위를 벗어나는 경우가 많습니다 - 36000000은 상당히 많은 숫자입니다!
이 경우 값은 int 데이터 유형에서 가장 작은 음의 값이 됩니다.
그러면 당신의 진술이 사실이 될 것입니다.
해당 식에 대한 각 인수는 정수이므로 결과는 정수가 됩니다.
매크로의 작동 방식에 대해 혼란스러워 하고 있는 것 같습니다.매크로의 값이 아니라 방정식 자체를 사용하는 것입니다.이건 당신의 혼란스러운 거짓말인 것 같아요.매크로에 괄호를 붙이거나 매크로를 사용하지 않는 것이 좋을 것 같습니다.
아무도 언급하지 않은 것은 매크로 정의를 완전히 괄호로 묶는다고 해서 문제가 완전히 해결되는 것은 아니라는 것입니다.
질문은 다음과 같습니다.
#define BIG_INTERVAL 60 * 60 * 1000
(그리고 질문자는 괄호가 부족한 것이 문제라는 것을 인정합니다.)그러나 다음과 같은 경우에도:
#define BIG_INTERVAL (60 * 60 * 1000)
각각의 상수(60, 60, 1000)는 분명히 int로 나타낼 수 있지만, 곱은 3600000인 반면 언어는 다음을 보장합니다.INT_MAX >= 32767
.
이 언어는 큰 정수 상수가 값을 유지할 수 있을 만큼 충분히 큰 유형이라고 말합니다(예:100000
유형 중 하나일 수 있습니다.int
또는 활자의long int
, (이러한 유형의 범위에 따라 달라짐). 그러나 식에 대한 규칙은 없으며, 심지어 일정한 식에 대해서도 없습니다.
다음과 같이 해결할 수 있습니다.
#define BIG_INTERVAL (60L * 60L * 1000L)
하지만 그건 일종의 유형입니다.long
그럴 필요가 없다고 해도 말입니다
연산자 우선 순위 문제와 관련하여 제가 가장 좋아하는 예는 다음과 같습니다.
#include <stdio.h>
#define SIX 1+5
#define NINE 8+1
int main(void)
{
printf("%d * %d = %d\n", SIX, NINE, SIX * NINE);
return 0;
}
물론 출력은
6 * 9 = 42
(Douglas Adams 참조).
언급URL : https://stackoverflow.com/questions/6689142/what-is-int-i-1why-i-60-60-1000-1-1000-true
'programing' 카테고리의 다른 글
CSS에서 if/else 조건을 사용할 수 있습니까? (0) | 2023.09.23 |
---|---|
스파크 데이터 프레임을 만듭니다.유형에 대한 스키마를 유추할 수 없습니다. (0) | 2023.09.23 |
Oracle 10g Express 홈 페이지가 뜨지 않습니다. (0) | 2023.09.23 |
GDB로 주어진 함수 범위의 변수를 선언하는 방법은? (0) | 2023.09.23 |
평균과 표준 편차가 주어진 정규 분포에서 확률을 계산하는 방법은 무엇입니까? (0) | 2023.09.23 |