Мне нужно знать, какой размер файла в битах приведет к переполнению целого числа и получению отрицательного значения.
(Вы имеете в виду «размер файла в байт »Файлы редко измеряются в битах.
То, как вы это делаете, зависит от байтов в файле.Как только сумма байтов, которые вы добавляете вместе, превышает INT_MAX
(см. limits.h
), значение совокупной суммы int
преобразуется в отрицательное значение.
Таким образом, максимальное значениеколичество байтов для конкретного файла будет на одно число меньше, чем число байтов, из-за которых суммация превысила INT_MAX
.т. е. на единицу меньше, чем число байтов, которые вы прочитали из файла, в точке, где сумма сначала превышает INT_MAX
- или, с практической точки зрения обнаружения этого в коде, сначала становится отрицательным.
ИКак указывает один из комментариев, если все байты равны 0x00
, то даже бесконечно большой файл никогда не будет соответствовать этому критерию.
РЕДАКТИРОВАТЬ 1: Что касается комментарияо том, что поведение переполнения не определено, вместо определения, стала ли сумма отрицательной, вместо этого проверьте, меньше ли (INT_MAX - sum)
значения последнего прочитанного байта, до , добавляя значение этого байта к сумме.
РЕДАКТИРОВАТЬ 2: Выражено в коде:
основной цикл, как я бы переписал его
c = 0;
bytes = 0;
while (1) {
if ((c = fgetc(fp)) == EOF) break;
if ((INT_MAX - sumdigsig) >= c) {
sumdigsig += c;
bytes++;
} else {
break;
}
}
пробных прогонов
head -c 1073741824 < /dev/urandom > large-file-of-random-bytes
./sum-file-bytes
Please Enter name of the File : large-file-of-random-bytes
sum is : 2147483572; read 16845621 bytes to reach that sum
head -c 1073741824 < /dev/zero > large-file-of-zeros
./sum-file-bytes
Please Enter name of the File : large-file-of-zeros
sum is : 0; read 1073741824 bytes to reach that sum