LINUX.ORG.RU

lolng long int - 8 or 4 bytes?


0

0

Демо-программа:

#include <stdio.h>

int main () {
long long int somevar;
printf ("the type of `somevar' is long long int\n");
printf ("sizeof(somevar):\t%i bytes\n", sizeof(somevar));
somevar = -1;
printf ("somevar = -1\nunsigned value of `somevar' is %u\n", somevar);
printf ("this is a value of 4 bytes, isn't it?\n");
return 0;
}


Вопрос:

я хочу хранить данные переменной типа int в восьми байтах.
Пока получается только в 4-х.

Что не так?


Сорри за очепятку в заголовке

Сорри за очепятку в заголовке сообщения

s0ldat
() автор топика

В стандартах Си/Си++ строго не оговорен размер ни одного типа. Есть только правило:

sizeof(char) <= sizeof(short) <= sizeof(int) <= sizeof(long) <= sizeof(long long)

KRoN73 ★★★★★
()

Это не проблема хранения - это проблема отображения.

printf ("somevar = -1\nunsigned value of `somevar' is %#llX\n", somevar);

Slavaz ★★★★★
()

> Что не так?

Если уж ты только учишься то неплохо бы использовать -Wall при компиляции:

t.c: In function ‘main’:
t.c:10: warning: format ‘%u’ expects type ‘unsigned int’, but argument 2 has type ‘long long int’

Правильный формат IMO: "%llu"

Да, и как выше сказали - long long int не гарантирует 8 байт.

HTH

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

Спасибо!

Действительно проблема в отображении.

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


Вдогонку:

Можешь проштудировать <stdint.h> на своей машине (желательно вместе со стандартом C99).

Увидишь всякие типы: int8_t, int16_t, int64_t и прочее разное.

Ну или вот: http://linux.die.net/man/3/int64_t

HTH

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

> В стандартах Си/Си++ строго не оговорен размер ни одного типа. Есть только правило:

> sizeof(char) <= sizeof(short) <= sizeof(int) <= sizeof(long) <= sizeof(long long)

sizeof(char) всегда 1.

В С99 в Annex E (informative) Implementation limits указаны нижние границы. В частности long long обязан быть достаточно вместимым для числа 9223372036854775807 (т.е. 64 бита)

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

> Да, и как выше сказали - long long int не гарантирует 8 байт.

sizeof(long long) не обязан быть >= 8. Но тем не менее стандарт требует чтобы он был не менее чем 64-битным.

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

> sizeof(char) всегда 1.

не всегда. на Watcom C был вариант ключей, когда char занимал 2 байта. AFAIR это было тесно связанно с нативной поддержкой азиатских кодировок.

// wbr

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

> не всегда. на Watcom C был вариант ключей, когда char занимал 2 байта. AFAIR это было тесно связанно с нативной поддержкой азиатских кодировок.

стандарт С четко требует sizeof(char) == 1. Это хорошо известная фича. Если char занимает два байта то это означает что sizeof(char) == 1 и CHAR_BIT == 16

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

>не всегда. на Watcom C был вариант ключей, когда char занимал 2 байта. AFAIR это было тесно связанно с нативной поддержкой азиатских кодировок

НЯП, это связано с тем, что есть платформы, где байт - 16 бит :)

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

>Если char занимает два байта

В стандарте фигурирует «байт» или, всё же, биты?

А то байт - он на разных платформах разный. И стандарта на число бит в байте нет.

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

> НЯП, это связано с тем, что есть платформы, где байт - 16 бит :)

ну может быть не столько байт, сколько машинное слово? anyway, если смотреть по стандарту, то sizeof(char) действительно должен возвращать строго единицу:

6.5.3.4 The sizeof operator
Constraints
1 The sizeof operator shall not be applied to an expression that has function type or an
incomplete type, to the parenthesized name of such a type, or to an expression that
designates a bit-field member.
Semantics
2 The sizeof operator yields the size (in bytes) of its operand, which may be an
expression or the parenthesized name of a type. The size is determined from the type of
the operand. The result is an integer. If the type of the operand is a variable length array
type, the operand is evaluated; otherwise, the operand is not evaluated and the result is an
integer constant.
3 When applied to an operand that has type char, unsigned char, or signed char,
(or a qualified version thereof) the result is 1. When applied to an operand that has array
type, the result is the total number of bytes in the array.84) When applied to an operand
that has structure or union type, the result is the total number of bytes in such an object,
including internal and trailing padding.

// wbr

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

>anyway, если смотреть по стандарту, то sizeof(char) действительно должен возвращать строго единицу

Угу. Выше уже писал товарищ.

Судя по всему, sizeof возвращает размер не в октетах, а именно в байтах. И, если байт в системе 16-битный, то sizeof 16-битного char'а там всё равно будет равен 1.

Но это, походу, именно в каких-то из новых стандартов (выше упоминался 99-й), так как sizeof(char)==2 я сам ещё помню :) Когда-то sizeof'ы в октетах измерялись.

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

> Но это, походу, именно в каких-то из новых стандартов (выше упоминался 99-й), так как sizeof(char)==2 я сам ещё помню :) Когда-то sizeof'ы в октетах измерялись.

да, это C99. ватком же, про который я вспоминал, активно использовался ещё до его рождения :)

// wbr

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