#c #integer #long-integer
#c #целое число #длинное целое число
Вопрос:
Быстрый простой вопрос (почти из любопытства):
Если я объявлю, например, в программе C a long int
, а затем вызову его в функции, принимающей an int
, я знаю, что он будет работать без каких-либо проблем, если я не дам ему значение размером 4 байта, что приведет к плохой печати содержимого.
Однако меня удивляет то, что он никак не предупреждает об этом. Если я объявляю 4 байта long int
, система знает, что у нее есть 32 бита для хранения этого значения. Но тогда, если я передам то же long int
самое функции, где она вызывает только int
(2 байта), я предполагаю, что я использую 16 бит в памяти, которые не должны использоваться этим значением.
Я прав? Или он будет использовать только младшие 16 бит из long int
полученных в качестве аргумента? Что здесь происходит?
Пример кода:
#include <stdio.h>
void test(int x) { // My question is why it accepts this?
printf("%d", x);
}
int main() {
long int y=4294967200; // 32 bits
test(y);
return 0;
}
Комментарии:
1. Можете ли вы показать нам, о чем вы говорите, с реальным примером кода?
2. отредактировано уже. Мой вопрос в том, почему он принимает передачу long int функции, которая, как предполагается, получила только int .
3. Это потому, что у вас есть некоторые неявные целочисленные преобразования.
4. Да, но что на самом деле происходит? Уменьшается ли он до половины размера при получении? Или просто переполняет само целое число?
5. Просто для ясности, вы скомпилировали это в системе, где
long
64 бита, верно? Потому что в Windows (любой битности) или 32-разрядных версиях различных UNIX-подобныхlong
иint
, как правило, совместимы; потери данных нет (за исключением того, что литерал усекается заранее).
Ответ №1:
Скорее всего, это потому, что вы не включили эту функцию в своем компиляторе. Например, использование GCC с включенными предупреждениями о преобразовании дает:
предупреждение: преобразование в ‘int’ из ‘long int’ может изменить его значение
Если вопрос в том, почему такие предупреждения не включены по умолчанию, это потому, что многие очень распространенные шаблоны кода выдают большое количество ложных предупреждений из-за автоматических продвижений. Например, unsigned char p[10]; ... p[1] ^= 1;
.
Комментарии:
1. Я увлекаюсь чтением ваших статей о глобальных денежных средствах, валюте, финансовых преступлениях. Очень редко я вижу такие вещи, которые заставляют меня понять, что все еще есть люди, которые думают.