LINUX.ORG.RU

[си] Конвертация байтов в гигабайты

 


0

0

Здравствуйте.

#define GBYTE 1073741824L

struct stat st;
stat ("/media/M/S_hdtv.avi", &st);

long int size = (long int) st.st_size;

puts ("---");
printf ("%u bytes\n", (int) size);
printf ("%.1f GB\n", (float) size / GBYTE);
puts ("---");


Данный код дает результат
---
3516432384 bytes
-0.7 GB
---

Размер файла - 3.3 гига, однако вывело -0.7 GB. Подскажите, в чем ошибка?

anonymous

>long int size = (long int) st.st_size;
Здесь ты потерял один бит, сделав его знаковым
printf ("st.st_size = %lu\n", st.st_size);
printf ("size = %ld\n", size);
st.st_size = 3516432384
size = -778534912

fopen ★★
()
Ответ на: комментарий от KRoN73

> >1073741824.0f

> Хренасе.


Ну ладно, double, без 'f'. Грешен. Вещественные числа в гробу видел еще когда матан сдавал.

spy_
()
Ответ на: комментарий от Legioner

> Используйте uint64_t. И ещё гигабайт это 1e9 байтов а не 2^30.

Любители бибикать - валите в свою википедию. У нас гигабайт - 2^30.

anonymous
()

#define GBYTE 0x40000000

struct stat st;
stat ("/media/M/S_hdtv.avi", &st);

uint64_t size = (uint64_t) st.st_size;

puts ("---");
printf ("%u bytes\n", (uint64_t) size);
printf ("%.1f GB\n", (float) size / GBYTE);
puts ("---");

redgremlin ★★★★★
()
Ответ на: комментарий от Deleted

>Ещё один со своей системой СИ (-_-)

Ну да, давайте вместо неё систему индивидуальную пихать, что ли? :)

Долой неоднозначности и несовместимости в определениях.

И долой несуществующую архитектуру x64 :D

KRoN73 ★★★★★
()
Ответ на: комментарий от KRoN73

Просто как по мне, так такие выверты в духе "а теперь метр будет равняться 97 сантиметрам" это ненормально. Назовите новую единицу не байт, а какой-нибудь "zyte", и обзывайтесь килозайтами и мегазайтами в 1000 и 1000000 сколько гугодно :)

Deleted
()
Ответ на: комментарий от Deleted

>Назовите новую единицу не байт

А при чём тут единица, если речь идёт не о них, а о приставках. Это ортогональные понятия.

KRoN73 ★★★★★
()
Ответ на: комментарий от KRoN73

Поскольку байты как таковый в СИ не входили, то им определение СИшных приставок так же ортогонально.

Deleted
()

struct stat st;
stat ("/media/M/S_hdtv.avi", &st);

puts ("---");
printf ("%lu bytes\n",  (unsigned long)st.st_size);
printf ("%lu Gbytes\n", (unsigned long)st.st_size >> 20);
puts ("---");

P.S. ((unsigned long)st.st_size >> 20) & 0xffffffffffful) - для параноиков.

anonymous
()
Ответ на: комментарий от anonymous

>>((unsigned long)st.st_size >> 20) & 0xffffffffffful)

ну, во-1-ых, не 20, а 30.

поотом

(unsigned long)(st.st_size >> 30)

- так получше будет. в особенности для файлов > 4GB (GiB)

xydo ★★
()
Ответ на: комментарий от xydo

но и это не гуд, если нужна еще дробная часть.

xydo ★★
()
Ответ на: комментарий от xydo

Очень даже важно. Как ты собираешься из 32х битного off_t извлекать 64х битный размер ?

Reset ★★★★★
()
Ответ на: комментарий от true_admin

> вот и выросло поколение юзеров которые считают что 1кб это 1000байт. Шутка :)

Вообще-то доля правды в этом есть :(

Пока не было наплыва маркетоидов в IT-сфере, килобайт был равен 1024 байт. Потом какая-то "умная" голова на очередном маркетоидном мозговом штурме выдала мысль: простым смертным не понять, почему килобайт не равен 1000. Нужно "стандартизировать".

И всё, появилась путаница. Потом захотели оставить название "килобайт" за 1000 байт, а за 1024 байт прикрепили название "кибобайт". Нет, чтобы наоборот, блин :( Это говорит о победе маркетоидов над разумом.

Slavaz ★★★★★
()
Ответ на: комментарий от Slavaz

Это победа как раз разума. Почему для какой-то одной единицы измерения понимание приставок должно отличаться от других? Почему для битов и байтов должно быть разное понимание одних и тех же приставок?

Человечество никак не может избавиться от, например, идиотских морских миль и узлов, зачем же ещё будущие поколения заставлять мучаться, если мы можем прекратить путаницу в зародыше (благо, «традиции» понимать приставки для байтов по особому всего полвека)? Какого фига нужно официально закреплять жаргон?

Между прочим, инженеры уже ухватились за возможность использования новых двоичных приставок для ЛЮБЫХ единиц измерения, и во всяких спецификациях вовсю используют кибиты с мебитами.

anonymfus ★★★★
()
Ответ на: комментарий от Reset

Ну хотябы с точки зрения манипуляции с числами на уровне двоичных операций: сдвиг регистра влево/вправо (умножение/деление на 2); также быстрая адресация к сегментам памяти; работа с масками (and/or/xor) и прочая ДВОИЧНАЯ логика/арифметика.

В эту картину "человеческое" 1000 вписывается намного кривее, чем "машинное" 1024, согласись?

P.S. во избежание перепалки "компьютер для человека, а не наоборот" добавлю: намного более логичным было бы не ломать представление о килобайте(1024), а внести новое понятие "кибобайт"(1000). Хотя бы только лишь для того, чтобы не было путанницы и чтобы "простые смертные" понимали специалистов и наоборот. Лично для меня до сих пор килобайт - это всё ещё 1024 байт. :(

Slavaz ★★★★★
()
Ответ на: комментарий от Slavaz

Лично я за "бибибайты". Тогда не приходится ломать голову что это за единица измерения. Тока название глупое.

true_admin ★★★★★
()
Ответ на: комментарий от true_admin

Да и мне придётся привыкнуть. Трудно просто, когда основы, с которых начинал, начинают меняться... или трудно это только для старпёров "кому за 30"? :)

Slavaz ★★★★★
()
Ответ на: комментарий от Slavaz

По-моему, к этому не надо привыкать. Это гораздо логичнее.

Я, например, никогда не понимал, как соотносится приставка кило-, которая означает 1000, с числом 2^10. Но приходилось принимать как данное =)

Теперь это извращение исправили.

anonymous
()

Спасибо за помощь.

Остановился на таком варианте:

#define GBYTE 1073741824L struct stat st; stat ("/media/M/S_hdtv.avi", &st);

unsigned long long size = (unsigned long long) st.st_size;

printf ("%llu bytes\n", (unsigned long long) st.st_size); printf ("%.2f GB\n", (float) size / GBYTE);

+добавил опцию при компиляции - -D_FILE_OFFSET_BITS=64

Вроде как работает. Если кто-нибудь видит косяки в этом коде, буду признателен если сообщите.

anonymous
()
Ответ на: комментарий от Deleted

>Поскольку байты как таковый в СИ не входили

Хорошо, смотри тогда в сторону МЭК

KRoN73 ★★★★★
()
Ответ на: комментарий от Slavaz

>Трудно просто, когда основы, с которых начинал, начинают меняться... или трудно это только для старпёров "кому за 30"? :)

Я «в отрасли» ровно 20 лет. Но новые приставки горячо одобряю. Давить неоднозначности и исключения.

KRoN73 ★★★★★
()
Ответ на: комментарий от KRoN73

>>Трудно просто, когда основы, с которых начинал, начинают меняться... или трудно это только для старпёров "кому за 30"? :)

> Я «в отрасли» ровно 20 лет. Но новые приставки горячо одобряю. Давить неоднозначности и исключения


Да я и не спорю. Так, "скриплю" тихонько ;)

Просто лично для меня это и есть неоднозначности, когда килобайт=1000 байт. Привыкну, куда деться... мозг ещё, дай Бог и далее, гибок, пытлив и обучаем. :)

Slavaz ★★★★★
()
Ответ на: комментарий от KRoN73

>Я «в отрасли» ровно 20 лет.
А что за отрасль ? :)

>Давить неоднозначности и исключения.
Даешь переписывание всех учебников - они все неправильно пишут о том что ток течет от плюса к минусу ? Больше ста лет все живут с этим и ни у кого вроде неоднозначности не возникает.

koTuk
()
Ответ на: комментарий от Slavaz

> Ну хотябы с точки зрения манипуляции с числами на уровне двоичных операций: сдвиг регистра влево/вправо (умножение/деление на 2); также быстрая адресация к сегментам памяти; работа с масками (and/or/xor) и прочая ДВОИЧНАЯ логика/арифметика.

В упор не понимаю каким образом это соотносится с тем, чтобы килобайт был равен 1024 байта.

Я за кибибайты, так путаницы меньше.

Reset ★★★★★
()
Ответ на: комментарий от koTuk

>Даешь переписывание всех учебников - они все неправильно пишут о том что ток течет от плюса к минусу ?

Ток течёт в направлении противоположном движению электронов. Где тут неоднозначности?

KRoN73 ★★★★★
()
Ответ на: комментарий от Reset

>В упор не понимаю каким образом это соотносится с тем, чтобы килобайт был равен 1024 байта.

Блоки памяти, адресуемой двоичным методом, делятся по степеням двойки. Т.е. можно иметь адресное пространство в 1 байт, в 2 байта, в 4 байта, 8 байт, 16, 32, 64... 512 байт, 1024 байта, 2048 байт, ... 16384 байт, 32768 байт, 65536, ... ... ...

Указать адресное пространство в 1000 байт - значит всё равно отвести на его реализацию 10 бит адреса. И 24 байта буду просто пропадать :)

Поэтому, адресовалась память исторически всегда степенями двойки. А, поскольку 1024 близко к 1000, то 1024 байта обозвали килобайтом и начали измерять бОльшие величины чанками в 2^10 = 1024 байт = «килобайт». Скажем, 65536 байт - не очень звучит и не очень запоминается новичками. А вот 64кБайт (что то же самое) - уже проще и понятнее.

При чём настолько проще и понятнее, что сейчас, когда, наконец, для 1024 придумали отдельную приставку, многие всё равно не хотят её принимать :)

KRoN73 ★★★★★
()
Ответ на: комментарий от koTuk

>Килобайт равен 1024 байт - где тут неоднозначность ?

В том, что в килобайте 1024 байта, а в километре - 1000 метров. Приставка одна, значения разные. Такого быть в нормальном мире не может :)

KRoN73 ★★★★★
()
Ответ на: комментарий от KRoN73

>В том, что в килобайте 1024 байта, а в километре - 1000 метров. Приставка одна, значения разные. Такого быть в нормальном мире не может :)

Напраление течения реки - это то куда движется вода, ток обусловлен движением электронов а они перемещаются от минуса к плюсу, такого не может быть в нормальном мире :)

koTuk
()
Ответ на: комментарий от koTuk

> Напраление течения реки - это то куда движется вода, ток обусловлен движением электронов а они перемещаются от минуса к плюсу, такого не может быть в нормальном мире :)

эт в металлах, чисто теоретичски ток может быть движением любых заряженных частиц %)

PS: а так-то да, 1Кбайт - 1024 байта (обычно), 1Кбит - 1000 бит (обычно), так что неоднозначность путает.

shild
()

s!#define GBYTE 1073741824L!#define GBYTE 1073741824UL!

unsigned long int

anonymous
()
Ответ на: комментарий от koTuk

>Напраление течения реки - это то куда движется вода

А северный ветер - это который на юг дует. Как такое в твоём нормальном мире может быть? :)

Или, вот, поток дырок в проводнике - он совпадает с направлением тока и противоположен движению электронов.

KRoN73 ★★★★★
()
Ответ на: комментарий от shild

>эт в металлах, чисто теоретичски ток может быть движением любых заряженных частиц %)

Кстати, да.

В растворе сульфата натрия ток будет совпадать с движением ионов Na⁺ и будет противоположен движению ионов SO₄²⁻

KRoN73 ★★★★★
()
Ответ на: комментарий от KRoN73

>эт в металлах, чисто теоретичски ток может быть движением любых заряженных частиц %) >В растворе сульфата натрия ток будет совпадать с движением ионов Na⁺ и будет противоположен движению ионов SO₄²⁻

Тем не менее основными проводниками являются металлы а не растворы или расплавы хим соединений или полупроводники в которых понятие "дырки" - вообще абстрактное. Не знаю что у вас за теории по котрым ток в металлах может быть движением любых заряженных частит - на нобелевскую не пробовали выдвигаться ? :)

koTuk
()
Ответ на: комментарий от KRoN73

>А северный ветер - это который на юг дует. Как такое в твоём нормальном мире может быть? :)

Это всего лишь игра слов - не надо меня с толку сбивать :) Есть например "южанин" (человек родился на юге) это не мешает ему прийти куда то с севера.

koTuk
()
Ответ на: комментарий от koTuk

>Тем не менее основными проводниками являются металлы

С чего ты взял? В природе электролитов (или плазмы) несравнимо больше, чем металлов.

Или ты очередной антропоцентрист? Ну тогда ориентируйся на большинство человечества и прими к сведению, что приставка кило - обозначает тысячу. man греческий язык.

KRoN73 ★★★★★
()
Ответ на: комментарий от KRoN73

>В природе электролитов (или плазмы) несравнимо больше, чем металлов.
Ну конечно - провода вокруг вас тоже из плазмы ? Не надо путать теплое с мягким.

>man греческий язык.
Со мной грек работает - проконсультируюсь при случае :)

koTuk
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.