C의 int에 long int를 할당하면 어떻게됩니까?
최근 숙제 long
에서 결과를 저장 하기 위해 변수를 사용하라는 말을 들었습니다 .
내 시스템 (인텔 코어 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
즉, 내 시스템에서 int
와 long
너무 큰 것 무엇이든 동일하고 있습니다 int
보류에 너무위한 큰 것 long
홀드에뿐만 아니라.
숙제 자체는 여기서 문제가되지 않습니다. 시스템에서을 어디에 int < long
할당해야하는지 궁금합니다 int
.
나는 사실을 알고 있어요 거기에 있는 많은 밀접하게 관련 이 주제에 대한 질문,하지만 난이 내 대답을하거나 그 과정에서 발생할 수 무슨의 완전한 이해로 날을 제공하지 않습니다 생각합니다.
기본적으로 다음을 알아 내려고 노력하고 있습니다.
- 해야 내가 캐스트
long
에int
할당하기 전에, 또는이후직접 할당하는 것이 무해한 것으로 간주됩니까?long
, 다른 데이터 타입이지만 단지 개질제 아니다 - 시스템에서는 어떤 일이 발생
long > int
합니까? 결과가 정의되지 않거나 예측할 수 없거나 변수의 추가 부분이 생략됩니까? - 어떻게에서 캐스팅을 수행
long
하는int
C의 작품? - 캐스팅을 사용하지 않을 때 C 에서
long
to to 할당은 어떻게int
작동합니까?
언어 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? */
}
"다른 것"의 세부 사항은 수행하려는 작업에 따라 달라집니다.
One correction: int
and long
are always distinct types, even if they happen to have the same size and representation. Arithmetic types are freely convertible, so this often doesn't make any difference, but for example int*
and long*
are distinct and incompatible types; you can't assign a long*
to an int*
, or vice versa, without an explicit (and potentially dangerous) cast.
And if you find yourself needing to convert a long
value to int
, the first thing you should do is reconsider your code's design. Sometimes such conversions are necessary, but more often they're a sign that the int
to which you're assigning should have been defined as a long
in the first place.
A long
can always represent all values of int
. If the value at hand can be represented by the type of the variable you assign to, then the value is preserved.
If it can't be represented, then for signed destination type the result is formally unspecified, while for unsigned destination type it is specified as the original value modulo 2n, where n is the number of bits in the value representation (which is not necessarily all the bits in the destination).
In practice, on modern machines you get wrapping also for signed types.
That's because modern machines use two's complement form to represent signed integers, without any bits used to denote "invalid value" or such – i.e., all bits used for value representation.
With n bits value representation any integer value is x is mapped to x+K*2n with the integer constant K chosen such that the result is in the range where half of the possible values are negative.
Thus, for example, with 32-bit int
the value -7 is represented as bitpattern number -7+232 = 232-7, so that if you display the number that the bitpattern stands for as unsigned integer, you get a pretty large number.
The reason that this is called two's complement is because it makes sense for the binary numeral system, the base two numeral system. For the binary numeral system there's also a ones' (note the placement of the apostrophe) complement. Similarly, for the decimal numberal system there's ten's complement and niners' complement. With 4 digit ten's complement representation you would represent -7 as 10000-7 = 9993. That's all, really.
ReferenceURL : https://stackoverflow.com/questions/13652556/what-happens-when-i-assign-long-int-to-int-in-c
'IT TIP' 카테고리의 다른 글
파생 클래스에서 보호 된 멤버에 액세스 (0) | 2021.01.08 |
---|---|
cv :: normalize (_src, dst, 0, 255, NORM_MINMAX, CV_8UC1); (0) | 2021.01.08 |
다른 ASP.NET 캐싱 옵션의 장단점 (0) | 2021.01.08 |
Object.observe를 지원하는 브라우저는 무엇입니까? (0) | 2021.01.08 |
어떤 OSS 라이선스와 호환되는 차트가 있습니까? (0) | 2021.01.08 |