Что происходит, когда я назначаю 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 долго?

я осознаю тот факт, что существует множество тесно связанных вопросов по этому вопросу, но я чувствую, что ответы в них не дают мне полного понимания того, что будет или может произойти в этом процессе.

в основном, я пытаюсь чтобы выяснить следующее:

  1. я должен бросить long до int перед назначением, или С long это не тип данных, а просто модификатор, будет считается нецелесообразным назначать напрямую?
  2. что происходит в системах, где long > int? Будет ли результат неопределенный (или непредсказуемый) или это вызовет дополнительные части переменная должна быть опущена?
  3. как происходит кастинг от long до int строительство в Си?
  4. как задание long до int работает в C, когда я не использовать кастинг?
2 53

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. Вот и все, правда.