C의 int에 long int를 할당하면 어떻게 됩니까?
최근 과제에서, 나는 사용하라는 말을 들었다.long
큰 숫자일 수 있으므로 결과를 저장할 변수입니다.
시스템(인텔 core i5/64비트 Windows 7/gnu gcc 컴파일러)에서 실제로 문제가 있는지 확인해보기로 했습니다.다음 코드가 검출되었습니다.
printf("sizeof(char) => %d\n", sizeof(char));
printf("sizeof(short) => %d\n", sizeof(short));
printf("sizeof(short int) => %d\n", sizeof(short int));
printf("sizeof(int) => %d\n", sizeof(int));
printf("sizeof(long) => %d\n", sizeof(long));
printf("sizeof(long int) => %d\n", sizeof(long int));
printf("sizeof(long long) => %d\n", sizeof(long long));
printf("sizeof(long long int) => %d\n", sizeof(long long int));
그럼 다음 출력이 생성됩니다.
sizeof(char) => 1
sizeof(short) => 2
sizeof(short int) => 2
sizeof(int) => 4
sizeof(long) => 4
sizeof(long int) => 4
sizeof(long long) => 8
sizeof(long long int) => 8
에서는, 꿔꿔말꿔스 in스 in 「 」int
★★★★★★★★★★★★★★★★★」long
안 된다, 안 된다, 안 된다, 안 된다, 안 된다, 안 된다.int
못 견디다long
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
숙제 자체는 여기서 문제가 되지 않는다.어떻게, 어떻게?int < long
을 int
★★★★★★★★★★★★★★★★★?
저는 이 주제에 대해 밀접하게 관련된 많은 질문들이 있다는 것을 알고 있지만, 그 안에 있는 답변들은 그 과정에서 어떤 일이 일어날지, 어떤 일이 일어날지에 대한 완전한 이해를 제공하지 못한다고 생각합니다.
기본적으로 다음 사항을 알아보려고 합니다.
long
로로 합니다.int
할당 전 또는 는다른 데이터타입이아니라 단순히 수정자일 뿐이며 직접 할당하는 것은 유해하지 않은 것으로 간주됩니까?- 음음음 what what where where where where where where where where시스템에서 일어나는 일
long > int
되지 않거나 아니면 의 추가 결과가 정의되지 않거나 예측 불가능한가? 니면변 변수 ?가? ?? ???? - 에서의 캐스팅은 어떻게 이루어집니까?
long
로로 합니다.int
C 동 、 c 、 c 、 c c? - 어떻게 요?
long
로로 합니다.int
캐스팅을 사용하지 않을 때 C에서 작동합니까?
합니다.int
'16비트',long
및 '32비트'입니다.long
적어도 모든 값을 나타낼 수 있습니다.int
를 나타낼 수 있습니다.
「」를 long
을 ""로 합니다.int
이치노명시적인 캐스팅은 필요 없습니다.그것은 단지 앞으로 일어날 것과 같은 변환을 명시하는 것일 뿐입니다.
하시는 시스템에서 " " " " 입니다.int
★★★★★★★★★★★★★★★★★」long
같은 사이즈와 범위를 가지기 때문에 변환은 간단하며 단순히 값을 복사합니다.
「 」가 되고 있는 .long
int
이 " "에 않는 int
변환 결과는 구현 정의입니다.(또는 C99부터는 구현 정의 신호를 생성할 수 있지만 실제로 이를 실행하는 컴파일러는 없습니다.)일반적으로는 상위 비트가 폐기되지만 이에 의존해서는 안 됩니다(규칙은 부호 없는 유형에 따라 다릅니다. 부호 없는 정수 또는 부호 없는 정수를 부호 없는 유형으로 변환한 결과는 잘 정의됩니다).
안전하게 할당할 필요가 있는 경우long
을 ""로 합니다.int
오브젝트는 할당을 수행하기 전에 그것이 맞는지 확인할 수 있습니다.
#include <limits.h> /* for INT_MIN, INT_MAX */
/* ... */
int i;
long li = /* whatever */
if (li >= INT_MIN && li <= INT_MAX) {
i = li;
}
else {
/* do something else? */
}
"다른 것"의 세부 사항은 여러분이 무엇을 하고 싶은지에 따라 달라질 것입니다.
의 수정: 1 ★★★★★★★★★★★★★★★★★★:int
★★★★★★★★★★★★★★★★★」long
크기와 표현이 같은 경우에도 항상 다른 유형입니다.산술형은 자유롭게 변환할 수 있기 때문에 큰 차이는 없지만, 예를 들어int*
그리고.long*
고유하고 호환되지 않는 유형입니다.long*
에 대해서int*
명시적(및 잠재적으로 위험한) 캐스팅이 없는 경우 또는 그 반대도 마찬가지입니다.
그리고 만약 당신이 당신이 이 모든 것들을long
에 가치를 두다.int
가장 먼저 해야 할 일은 코드 디자인을 재고하는 것입니다.가끔은 그런 변환이 필요하지만, 더 자주 그런 변환은 더 많은 경우,int
할당하는 것은, 「유저명」이라고 정의되어 있을 필요가 있습니다.long
애초에.
A long
항상 모든 값을 나타낼 수 있다int
할당하는 변수의 유형으로 가까운 값을 나타낼 수 있는 경우 값은 유지됩니다.
표시할 수 없는 경우 서명된 수신처 유형의 경우 결과가 정식으로 지정되지 않은 반면, 서명되지 않은 수신처 유형의 경우 원래 값 모듈로n 2로 지정됩니다. 여기서 n은 값 표현(행선지의 모든 비트는 아님)의 비트 수입니다.
실제로 현대식 기계에서는 싸인형 포장도 가능합니다.
이는 현대 기계가 부호 있는 정수를 나타내기 위해 2의 보형 형식을 사용하기 때문이며, "무효값" 등을 나타내기 위해 사용되는 비트(예: 값 표현에 사용되는 모든 비트)는 없습니다.
n비트 값 표현에서는 x의 정수 값이 x+K*2에n 매핑되며, 결과는 가능한 값의 절반이 음의 범위 내에 있도록 정수 상수 K가 선택됩니다.
예를 들어 32비트의 경우int
값 -7은 비트 패턴 번호 -7+232 = 2-7로32 나타나기 때문에 비트 패턴이 나타내는 숫자를 부호 없는 정수로 표시하면 상당히 큰 숫자를 얻을 수 있습니다.
이것이 2의 보완이라고 불리는 이유는 2진수 체계, 즉 2진수 체계에 이치에 맞기 때문입니다.2진법에는 1의 보수가 있습니다(아포스트로피 배치에 주의).마찬가지로, 십진법에는 10과 9의 보수가 있다.4자리 10의 보완 표현에서는 -7을 10000-7 = 9993으로 나타낼 수 있습니다.그게 다예요, 정말로.
언급URL : https://stackoverflow.com/questions/13652556/what-happens-when-i-assign-long-int-to-int-in-c
'programing' 카테고리의 다른 글
클릭 시 v-date-picker v-menu를 열고 v-text-field에 초점을 맞춥니다. (0) | 2022.07.12 |
---|---|
정수 오버플로로 인해 메모리 파손으로 정의되지 않은 동작이 발생합니까? (0) | 2022.07.12 |
autoconf 및 autotools 대체 방법 (0) | 2022.07.12 |
vuetify 데이터 테이블에서 행 내부의 버튼 클릭 이벤트와 행 클릭 이벤트를 분리하는 방법 (0) | 2022.07.12 |
Vue-i18n '프록시에 정의되지 않은 속성 '_t'을 읽을 수 없습니다.Vue.$t' (0) | 2022.07.12 |