Войти
ФлеймФорумОбщее

Тип int (3 стр)

Страницы: 1 2 3 4 5 Следующая »
#30
12:50, 21 окт. 2005

1. Единственное, что определяет стандарт, это:
sizeof(short) <= sizeof(int) <= sizeof(long) и так далее. Никаких жестких условий на разрядность int не налагается.
2. В некоторых реализациях CodeWarrior для консолей long бывает уже 128-битный. Что будет на next gen, уже думать не хочется.


#31
14:05, 21 окт. 2005

Rat_Salad

Раньше, когда компьютеры были большими и приводились в действие силой пара... :)

Для 16-разрядных процессоров тип int = 16 битам.
Для 32-ух разрядных - 32-ум битам и т.д. Все просто и не нужно траву раскуривать.

#32
14:34, 21 окт. 2005

А как же тогда гарантировано взять 2 байта (word) из памяти, и с битовыми массивами данных работать? Если стандартом ничего не гарантируется...

#33
14:57, 21 окт. 2005

Dexus
>А как же тогда гарантировано взять 2 байта
Использовать какой-нибудь uint16_t ( http://www.boost.org/boost/cstdint.hpp )

#34
15:01, 21 окт. 2005

Димка
Налагается! Для этого и существуют спецификации. Это еще издавна пошло, со времен  8-ми разрядных машин.
Одно машинное слово - 8 бит, два - 16 бит (тип int), четыре - двойное слово: 32 бита.
Раньше это был тип long int (32 бита), теперь просто int.

#35
15:14, 21 окт. 2005

kerosene
>Димка
>Налагается!
Да ну?! Где?!

#36
15:44, 21 окт. 2005

В обратном хронологическом порядке.
kerosene
> Для этого и существуют спецификации. Это еще издавна пошло, со времен 8-ми разрядных машин.
> Одно машинное слово - 8 бит, два - 16 бит (тип int), четыре - двойное слово: 32 бита.
> Раньше это был тип long int (32 бита), теперь просто int.
Не пугай людей, прочти C или C++ FAQ.
А еще лучше - какую-нибудь хорошую книжку по предмету.

Mercury13
> Если нужно поле точно заданного размера, используйте char, short, long или long long.
sizeof(char)<=sizeof(short)<=sizeof(int)<=sizeof(long)
Плюс в C99: <=sizeof(long long).

Если нужны конкретные диапазоны (например, 32 бита), следует использовать int32_t или варианты типа nearest, fastest и т.п.

Гусли
>>16 бит - это минимально возможный размер int.
> если можно, пункт стандарта ;)
C++2003 18.2.2/1 (отсылка в C90 limits.h)

C++2003 3.9.1/2 (сноска 39)

C90/C99  5.2.4.2.1/1:
  "— minimum value for an object of type int
  INT_MIN -32767 // -(2^15 - 1)
  — maximum value for an object of type int
  INT_MAX +32767 // 2^15 - 1
  — maximum value for an object of type unsigned int
  UINT_MAX 65535 // 2^16 - 1"

C++2003 3.9.1/3:
  "each signed integer type has the same object representation as its corresponding unsigned integer type."

Разжёвывать детально, почему 16 бит - минимум?

IROV..
> "0" это положительное число.. ;) поэтому и 32767 а так как минусовых и плюсовых чисел одинаково.. то -32768
В представлении со знаковым битом есть два нуля.  Один из них фиксируется как корректный, второй - как запрещенный.
На некоторых аппаратных платформах второй будет вызывать аппаратный trap при попытке загрузки в регистр.
Это объясняет, в частности, почему unsigned char является единственным типом, подходящим для работы с сырой памятью.

Dexus
> С какой стати -32767 ? 0x8000 знаковое будет именно -32768 (знаковое 16битное)
Потому что стандарт допускает три знаковых предствления - дополнение до 2, дополнение до 1 и знаковый бит.
Поэтому гарантированные лимиты для INT_MIN/INT_MAX - именно те, что я назвал.

#37
16:17, 21 окт. 2005

aruslan
Спасибо, вы правы, просто меня смутило sizeof(char)<=sizeof(short)<=sizeof(int)<=sizeof(long) и sizeof(char) == 1, всё время забываю что 1 это совсем не обязательно 8 бит, ещё раз спасибо.
>>Разжёвывать детально, почему 16 бит - минимум?
Мне бы очень хотелось услышать разъяснение.

#38
17:35, 21 окт. 2005

Гусли
>>Разжёвывать детально, почему 16 бит - минимум?
> Мне бы очень хотелось услышать разъяснение.
Первый способ - простой:
1. sizeof(unsigned int)==sizeof(int) по 3.9.1/3.
2. Требования к типу unsigned int в C++ совпадают с таковыми в C90 по 3.9.1/2 (сноска 39) и 18.2.2/1.
3. Тип unsigned int обязан поддерживать гарантированный диапазон 0..65535 по C90/C99  5.2.4.2.1/1.
4. Минимально возможное количество бит для представления всех чисел из гарантированного диапазона (0..65535) - 16 бит.
5. Modus ponens по (1) и (4) - гарантированное количество бит в int - 16.

Второй способ - сложный:
1. Требования к типу int в C++ совпадают с таковыми в C90 по 3.9.1/2 (сноска 39) и 18.2.2/1.
2. Тип int обязан поддерживать гарантированный диапазон -32767..+32767 по C90/C99  5.2.4.2.1/1.
3. Необходимость: для представления всех чисел из гарантированного диапазона требуется минимум 16 бит.
4. Достаточность: аккуратно считается необходимое количество бит для дополнения до 2, дополнения до 1 и со знаком, получается 16 бит.
5. Modus ponens по (3) и (4) - гарантированное количество бит в int - 16.

#39
17:47, 21 окт. 2005

aruslan
А, вы про диапазоны, ну с этим как раз всё понятно, я думал вам известна причина почему гарантированые диапазоны для int именно такие, однако всё равно спасибо за ответ.

#40
19:11, 21 окт. 2005

aruslan
>IROV..
>> "0" это положительное число.. ;) поэтому и 32767 а так как минусовых и
>>плюсовых чисел одинаково.. то -32768
>В представлении со знаковым битом есть два нуля. Один из них фиксируется как
>корректный, второй - как запрещенный.
>На некоторых аппаратных платформах второй будет вызывать аппаратный trap при
>попытке загрузки в регистр.
>Это объясняет, в частности, почему unsigned char является единственным типом,
>подходящим для работы с сырой памятью.

Можеш написать тест где это хорошо видно?

#41
19:15, 21 окт. 2005

aruslan

short int A0 = -32768;
short int A1 = 32767;

printf("\n(%d) - (%d)\n", A0,A1);

(-32768) - (32767)

#42
19:35, 21 окт. 2005

IROV..
Что ты этим хотел сказать?
Что у тебя signed int представлен дополнениями, а не знаковым битом?
Так я в ответ на это могу сказать, что у меня int - вообще 56-битный, и я реально не понимаю твоих проблем с представлением чисел больше 2^31.

#43
19:54, 21 окт. 2005

aruslan
>у меня int - вообще 56-битный
Ух ты, какую траву у вас там игровые автоматы курят :)

#44
20:14, 21 окт. 2005

aruslan
>IROV..
>Что ты этим хотел сказать?
Если у меня не получилось.. скажи ты..

Можеш написать тест где это хорошо видно?

просто меня интерисует практическое значение того что ты сказал, а именно..

В представлении со знаковым битом есть два нуля.  Один из них фиксируется как
корректный, второй - как запрещенный.  [-32767,32767]

.....

>Так я в ответ на это могу сказать, что у меня int - вообще 56-битный, и я
>реально не понимаю твоих проблем с представлением чисел больше 2^31.

а в языках народа Африки.. таких чисел вообще нету.. У них столько кокосов не собираеться.. (c) IROV..

у меня никогда с этим проблем не было.. это все для самообразования..
Ну вот мне интерестно почему я ранше читал/думал что short int это диапазон [-32768,32767] на моем родном VS 6/7
а тут оказываеться что я был неправ.. хочеть более детально узнать..

Страницы: 1 2 3 4 5 Следующая »
ФлеймФорумОбщее

Тема в архиве.