Что происходит, когда я назначаю long int для int в C?
в последнее время на домашнее задание, мне сказали, чтобы использовать long
переменная для хранения результата, так как это может быть большое количество.
я решил проверить, будет ли это действительно важно для меня, в моей системе (Intel core i5/64-битный компилятор windows 7/gnu gcc) и обнаружил, что следующий код:
printf("sizeof(char) => %dn", sizeof(char));
printf("sizeof(short) => %dn", sizeof(short));
printf("sizeof(short int) => %dn", sizeof(short int));
printf("sizeof(int) => %dn", sizeof(int));
printf("sizeof(long) => %dn", sizeof(long));
printf("sizeof(long int) => %dn", sizeof(long int));
printf("sizeof(long long) => %dn", sizeof(long long));
printf("sizeof(long long int) => %dn", 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
строительство в Си? - как задание
long
доint
работает в C, когда я не использовать кастинг?
2 ответа:
язык гарантирует, что
int
по крайней мере 16 бит,long
составляет не менее 32 бит, иlong
представлять по крайней мере все значения, которыеint
может представлять.при назначении
long
значение
A
long
всегда может представлять все значенияint
. Если значение может быть представлено типом переменной вы присваиваете, то значение сохраняется.если он не может быть представлен, то для подписанного типа назначения результат формально не определен, а для неподписанного типа назначения он указан как исходное значение по модулю 2n, где n - это количество битов в представлении значения (которое не является обязательно все биты в пункте назначения).
на практике, на современных машинах вы получаете упаковку также для подписанных типов.
это потому, что современные машины использовать две формы для представления целых чисел со знаком, без каких – либо битов, используемых для обозначения "недопустимого значения" или такого-т. е. все биты, используемые для представления значения.
С n представление значения битов любое целочисленное значение x сопоставляется x+K*2n С целочисленной константой K, выбранной таким образом, что результат находится в диапазоне, где половина возможных значений отрицательны.
Так, например, с 32-битным
int
значение -7 представлено как число bitpattern -7+232 = 232-7, так что если вы отобразите число, которое bitpattern обозначает как целое число без знака, вы получите довольно большое число.причина, по которой это называется два потому что это имеет смысл для двоичной системы счисления, двух ичной системе счисления. Для двоичной системы счисления также есть дополнение единиц (обратите внимание на размещение Апострофа). Аналогично, для десятичной системы счисления существует дополнение десяти и дополнение девяти. С 4-значным представлением дополнения ten вы представляете -7 как 10000-7 = 9993. Вот и все, правда.