2015-08-29 6 views
1

У меня возникли некоторые нечетные проблемы в последнее время с некоторым кодом, который я написал.Умножение на sizeof (char) отличается от умножения на размер char

printf("%li\n",(sizeof(char))); 
printf("%li\n",sizeof(4*(sizeof(char)))); 

Когда я запускаю код, первая строка печатает «1», а вторая печатает «8». Если бы я умножился 4 на 1, я бы получил четыре. Почему это происходит?

+0

Любопытный: Почему вы определили формат кода ''% li \ "' с 'sizeof (char))'? – chux

+0

Спецификатор формата для 'size_t' (тип результата' sizeof') - ''% zu ''! – Olaf

+0

Правильный C99/C11 ['printf()'] (http://pubs.opengroup.org/onlinepubs/96999197/functions/printf.html) модификатор длины для 'size_t' -' z', как в '% zu '. Это то, к чему стремился @chux - вы должны использовать '% zu' или что-то подобное, а не'% li', которое не гарантируется. –

ответ

6

Возможно, вы хотели напечатать 4*(sizeof(char)). Это дало бы 4.

Однако вы фактически напечатали sizeof(4*(sizeof(char))). sizeof дает количество байтов, необходимых для хранения его операнда.

Тип 4*sizeof(char): size_t, который является 64-разрядным в вашей системе, поэтому вы получаете 8 в качестве выходного.

Получать тот же результат: sizeof(123456*sizeof(float)). sizeof ничего не говорит о значении его операнда, сколько байтов требуется для его хранения.

0

4*sizeof(char) 4, но это size_t (обычно такого же размера, как long). Его размер равен 8 на вашей 64-битной машине.

+5

Поскольку результат 'sizeof (char)' является значением 'size_t',' 4 * sizeof (char) 'также является' size_t' и 'sizeof (4 * sizeof (char))' - это размер 'size_t', который равен 8 на 64-битной машине. Итак, мое возражение связано с появлением 'int' в вашем ответе, не в последнюю очередь потому, что на всех 64-битных машинах, которые я знаю в текущем использовании,' sizeof (int) 'равно 4 (32 бита), а не 8. –

+0

@JonathanLeffler: Разве альфа не использовал ILP64 (64 бит 'int' /' long' _pointer_)? IIRC, все еще есть некоторые в использовании, и по крайней мере ранние версии имели только загрузку слов/хранилище. (Возможно, я ошибаюсь, но давно). – Olaf

+0

@JonathanLeffler: Я сейчас просматриваю, возможно, вы быстрее найдете доказательства: http://h18002.www1.hp.com/alphaserver/technology/chip-docs.html – Olaf

Смежные вопросы