if-statement의 () 연산자 크기
#include <stdio.h>
int main(void)
{
if (sizeof(int) > -1)
printf("True");
else
printf("False");
}
인쇄됩니다.False
size of()가 다음 값을 반환하지 않는 이유는 무엇입니까?if
?
sizeof
함수가 아니라 연산자입니다.괄호는 연산자 이름의 일부가 아닙니다.- 생성된 값의 서명되지 않은 유형이 있기 때문에 실패했습니다.
size_t
그것은 "일반적인 산술 변환"을 유발합니다.-1
서명되지 않은 숫자로 변환됩니다. 이 경우 매우 큰 숫자입니다.
기본적으로 당신은 비교하고 있습니다.4 > 0xffffffffu
아니면 적어도 그것에 가까운 것.자세한 내용은 이 질문을 참조하십시오.
서명되지 않은 서명된 정수 프로모션(정확하게는 "일반적인 산술 변환").sizeof
유형 값을 산출합니다.size_t
그리고 부호 없는 값과 비교했을 때 (어느 것이size_t
is), -1은 해당 유형으로 승격되고, 오버플로우되어 커집니다.
부호 없는 정수 오버플로는 잘 정의된 동작을 가지며 모듈로 간주됩니다.2 ^ width
,어디에width
는 특정 부호 없는 정수 유형의 비트 수입니다.32비트 폭이 있는 경우size_t
그리고.int
예를 들어, 당신의 비교는 다음과 같습니다.
if (4 > 4294967295u)
그건 명백히 거짓입니다.
- if 문에서 > 연산자의 피연산자는
sizeof(int)
그리고.-1
. sizeof(int)
유형의size_t
부호 없는 정수임이 보장됩니다.실제로는.size_t
아마 적어도 크기는 될 것입니다.unsigned int
모든 시스템에서.-1
유형의int
와 동등한.signed int
.- 두 피연산자 모두 정수 유형이 충분히 크기 때문에 정수 승격이 발생하지 않습니다.
- 그런 다음 두 피연산자는 공식적으로 일반적인 산술 변환이라고 하는 C 규칙에 따라 균형을 맞춥니다.
다음 상태(C116.3.1.8):
...
그렇지 않으면 부호 있는 정수 유형의 피연산자 유형이 부호 없는 정수 유형의 피연산자 유형의 모든 값을 나타낼 수 있는 경우 부호 없는 정수 유형의 피연산자는 부호 있는 정수 유형의 피연산자 유형으로 변환됩니다.
그렇지 않으면 두 피연산자 모두 부호 있는 정수 유형의 피연산자 유형에 해당하는 부호 없는 정수 유형으로 변환됩니다.
- (서명됨) 이후에 위 중 후자가 발생합니다.
int
a의 모든 값을 적합시킬 수 없습니다.size_t
. - 따라서
-1
부호 없는 정수로 변환됩니다.실제로는.size_t
서명되지 않은 길이 또는 서명되지 않은 길이와 동일할 수 있습니다.이러한 변수에 -1을 저장하면 어떤 일이 일어나든 구현 정의 동작입니다. - 의 보완 컴퓨터%)에서은 2의 컴 세 퓨 터 보 완 에 컴 (서 의 전 터 퓨 99.9%)로됩니다.
0xFFFFFFFF
(FF의 수는 지정된 시스템의 int 크기에 따라 달라집니다.) 4 > 0xFFFFFFFF
거짓으로 평가됩니다.
크기는 부호 없는 긴int를 생성하는 연산자입니다.하면 따서부없호 longint를 -1로 됩니다.0xffffffff
(int의 크기는 4바이트입니다.)
-1은 기본적으로 부호 있는 정수입니다.그러나 서명된 int와 서명되지 않은 int를 비교할 때 컴파일러는 서명되지 않은 int에 대한 암묵적인 형식 캐스팅을 수행합니다.따라서 부호가 없는 -1은 약 4.6기가 값과 같습니다.
따라서, 출력은 다음과 같습니다.false
.
이것을 테스트하고 직접 확인해 보십시오.
#include <stdio.h>
main() {
unsigned int a=4;
int b = -1;
//this is what you're doing
printf("%u vs %u\n", a, (unsigned int)b);
//this is what you want to do instead
printf("%d vs %d\n", (int)a, b);
}
언급URL : https://stackoverflow.com/questions/17293749/sizeof-operator-in-if-statement
'programing' 카테고리의 다른 글
여러 Excel 인스턴스를 시작했는데, 이 모든 인스턴스에 대한 애플리케이션 개체를 어떻게 얻을 수 있습니까? (0) | 2023.08.25 |
---|---|
PHP-MySQL-MySQL 정수 필드를 안전하게 증가시키는 방법? (0) | 2023.08.25 |
요청한 버전과 일치하는 NDK 버전이 없습니다. (0) | 2023.08.25 |
스프링 3 mvc를 GWT와 통합한 경험이 있습니까? (0) | 2023.08.25 |
Powershell에서 .exe 실행의 모든 출력을 파이프로 연결하는 방법은 무엇입니까? (0) | 2023.08.25 |