IT TIP

C의 int에 long int를 할당하면 어떻게됩니까?

itqueen 2021. 1. 8. 22:41
반응형

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

즉, 내 시스템에서 intlong너무 큰 것 무엇이든 동일하고 있습니다 int보류에 너무위한 큰 것 long홀드에뿐만 아니라.

숙제 자체는 여기서 문제가되지 않습니다. 시스템에서을 어디에 int < long할당해야하는지 궁금합니다 int.

나는 사실을 알고 있어요 거기에 있는 많은 밀접하게 관련 이 주제에 대한 질문,하지만 난이 내 대답을하거나 그 과정에서 발생할 수 무슨의 완전한 이해로 날을 제공하지 않습니다 생각합니다.

기본적으로 다음을 알아 내려고 노력하고 있습니다.

  1. 해야 내가 캐스트 longint할당하기 전에, 또는이후 long, 다른 데이터 타입이지만 단지 개질제 아니다 직접 할당하는 것이 무해한 것으로 간주됩니까?
  2. 시스템에서는 어떤 일이 발생 long > int합니까? 결과가 정의되지 않거나 예측할 수 없거나 변수의 추가 부분이 생략됩니까?
  3. 어떻게에서 캐스팅을 수행 long하는 intC의 작품?
  4. 캐스팅을 사용하지 않을 때 C 에서 longto to 할당은 어떻게 int작동합니까?

언어 int는 최소 16 비트, long최소 32 비트, long표현할 수 있는 모든 값을 int표현할 수 있음을 보장합니다 .

개체에 long값을 할당하면 int암시 적으로 변환됩니다. 명시적인 캐스트가 필요하지 않습니다. 어쨌든 일어날 동일한 변환을 지정합니다.

당신의 시스템에서 intlong동일한 크기와 범위가하는 일이, 변환은 간단하다; 단순히 값을 복사합니다.

long보다 넓은 시스템에서 int값이에 맞지 않으면 int변환 결과가 구현에 따라 정의됩니다. (또는 C99에서 시작하여 구현 정의 신호를 발생시킬 수 있지만 실제로 그렇게하는 컴파일러에 대해서는 모릅니다.) 일반적으로 발생하는 것은 상위 비트가 삭제되지만 의존해서는 안됩니다. 그것에. (부호없는 유형의 경우 규칙이 다릅니다. 부호있는 정수 또는 부호없는 정수를 부호없는 유형으로 변환 한 결과는 잘 정의되어 있습니다.)

객체에 안전하게 할당 해야하는 경우 할당 을 수행하기 전에 longint이 맞는지 확인할 수 있습니다.

#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

반응형