Разница в методах fRead - PullRequest
       83

Разница в методах fRead

1 голос
/ 19 июня 2020

Я просматриваю старую cpp программу, которая читает данные из двоичного файла. Код написан для ОС Ma c и для ОС Ma c. Автор (с которым я не могу связаться) использует два варианта fread (). Один со вторым аргументом, указанным как sizeof (int), а другой как sizeof (без знака). Предполагая, что sizeof (int) == sizeof (unsinged) есть ли разница в использовании этих двух методов?

fread(&intArr[0], sizeof (int), 1, datafile);
fread(&intArr[0], sizeof (unsigned), 1, datafile);

http://www.cplusplus.com/reference/cstdio/fread/

указывает, что второй Аргумент - это размер байтов каждого читаемого элемента, поэтому я не думаю, что должна быть какая-либо разница в их возрасте использования (если, конечно, sizeof () не отличается). Эти два варианта смешаны (по-видимому, случайным образом) по всему файлу, и я не могу определить, почему оригинальный автор использовал тот или иной. Я просто хочу быть уверенным, что не упускаю какую-то крошечную деталь, которая могла бы повлиять на их реализацию.

1 Ответ

2 голосов
/ 19 июня 2020

Предполагая, что sizeof (int) == sizeof (unsigned), есть ли разница в использовании этих двух методов?

Нет. Оператор sizeof преобразует во время компиляции в значение типа size_t (обычно это unsigned long или unsigned long long), которое является количеством байтов в этих типах (обычно 4 или 8) .

Фактически, этот проект стандарта C ++ утверждает, что int и unsigned int будут одного размера:

6.7.1 Основные типы ... 3 Для каждого из стандартных целочисленных типов со знаком существует соответствующий (но другой) стандартный целочисленный тип без знака: «unsigned char», «unsigned short int», «unsigned int», «unsigned long int» , и «unsigned long long int», каждый из которых занимает такой же объем памяти и имеет те же требования к выравниванию (6.6.5), что и соответствующий целочисленный тип со знаком ...

Кроме того, использование unsigned само по себе эквивалентно unsigned int. Из cppreference (я не могу найти его в проекте стандарта, но этот сайт обычно надежен):

Целочисленные типы int - базовый c целочисленный тип. Ключевое слово int может быть опущено, если используется какой-либо из модификаторов, перечисленных ниже.

unsigned затем указывается как один из этих «модификаторов».)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...