Модераторы: LSD

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Целочисленные типы данных. 
:(
    Опции темы
 
Меня существующий "зоопарк" ...
устраивает; [ 13 ]  [76.47%]
не устраивает. [ 4 ]  [23.53%]
Всего проголосовавших: 17
В этом опросе возможен один вариант ответа
Гости не могут голосовать 
kemiisto
Дата 18.7.2010, 18:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дикий Кот. =^.^=
****
Награды: 1



Профиль
Группа: Участник Клуба
Сообщений: 3292
Регистрация: 29.7.2007

Репутация: 3
Всего: 160



Хочу чтобы разрядность конкретного псевдонима типа была постоянной при переходе с платформы на платформу. 

Не хочу "зоопарка" типов с различной разрядностью, не хочу беззнаковых типов. Экономия памяти таких масштабов (скажем, 1 млн. 32-битных целых против 1 млн. 8-битных - целых 3(!) МБ памяти) имела смысл в 70-е. Но не сейчас. А проблем слишком много.

Хочу один целочисленный знаковый тип фиксированной разрядности. 32-битный. Назовём его Int. Я не представляю зачем нужны целые числа фиксированной разрядности больше чем 2147483647. Да, я в курсе, про размер указателей в 64-битных системах. Но, во-первых, мне не нужен прямой доступ к памяти. Во-вторых, пускай (если кого "припрёт") для этих целей используется отдельный тип данных (Pointer), неприводимый к моему Int.

В качестве послабления дарую smile возможность иметь встроенную / библиотечную длинную арифметику. BigInt.

Итого: Int (signed 32-only), BigInt (можно библиотечно), Pointer (только, если язык для системного программирования).

Из того, что мне известно. Haskell почти укладывается со своими Int/Integer, но хотелось бы чтобы Int таки имел фиксированную разрядность, а не covers at least the range [ - 2^29, 2^29 - 1]. Oberon-07 с единственным 32-битным INTEGER, длинная арифметика библиотечно.

Но писать-то приходится на... сами_знаете_чём. В качестве компромиса можно форсировать использование только 32-битных знаковых целых. Но сторонний код... Переполнения... Хорошо если в языке есть механизм, позволяющий конролировать арифметические переполнения... Всё равно - не то. smile 

А что думаешь ты, %username%?


--------------------
PM MAIL WWW GTalk Jabber   Вверх
Void
Дата 18.7.2010, 18:35 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

Репутация: 11
Всего: 173



Где зоопарк-то кроме C и C++? В Java и .NET размеры всех примитивных типов прибиты гвоздями, плюс строгие правила по поводу потери точности: без явного приведения типов int в short не запихнёшь. Динамические языки сплошь и рядом используют целый тип с плавным перетеканием в длинную арифметику. А в системном языке в любом случае нужен будет полный набор int|uint{8,16,32,64}, потому что API и протоколы.
Цитата(kemiisto @  18.7.2010,  20:03 Найти цитируемый пост)
А что думаешь ты, %username%? 

Что в этот раз ты высосал проблему из пальца.

(отредактировал, было "short в int")

Это сообщение отредактировал(а) Void - 18.7.2010, 18:44


--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
Abyx
Дата 18.7.2010, 18:49 (ссылка)  | (голосов:3) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 601
Регистрация: 3.11.2009

Репутация: нет
Всего: 10



Цитата(kemiisto @  18.7.2010,  18:03 Найти цитируемый пост)
Я не представляю зачем нужны целые числа фиксированной разрядности больше чем 2147483647

а те кому надо - представляют. 

kemiisto, юзайте питон, там одни тип int - бесконечной разрядности.

бесят такие темы, когда люди пишут "зачем ххх" не понимая зачем оно надо.
PM MAIL   Вверх
kemiisto
Дата 18.7.2010, 18:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дикий Кот. =^.^=
****
Награды: 1



Профиль
Группа: Участник Клуба
Сообщений: 3292
Регистрация: 29.7.2007

Репутация: 3
Всего: 160



Цитата(Void @  18.7.2010,  19:35 Найти цитируемый пост)
Где зоопарк-то кроме C и C++?

Видели! Это не я сказал! smile 

Цитата(Void @  18.7.2010,  19:35 Найти цитируемый пост)
В Java и .NET размеры всех примитивных типов прибиты гвоздями, плюс строгие правила по поводу потери точности: без явного приведения типов short в int не запихнёшь.

Погоди, погоди. Во-первых, примитивных типов и там, и там больше одного. В Java поменьше будет, т.к. нет беззнаковых. НО! Зачем язык усложнять, если оне не актуально. Ладно для системных ЯП. А тут... Чего огород городить со всякими явными приведениями типов, checked/unchecked и т.п.?

Цитата(Void @  18.7.2010,  19:35 Найти цитируемый пост)
Динамические языки сплошь и рядом используют целый тип с плавным перетеканием в длинную арифметику.

Вот это фуфло полное, по мне. Когда оно там перетечёт не знаешь. Всё-таки 32-битные пусть будут.

Цитата(Void @  18.7.2010,  19:35 Найти цитируемый пост)
Что в этот раз ты высосал проблему из пальца.

 smile

Добавлено @ 18:54
Цитата(Abyx @  18.7.2010,  19:49 Найти цитируемый пост)
а те кому надо - представляют.

Ну-ка, расскажи!

Цитата(Abyx @  18.7.2010,  19:49 Найти цитируемый пост)
kemiisto, юзайте питон, там одни тип int - бесконечной разрядности.

И феерическая производительность. smile Нет уж, спасибо.

Цитата(Abyx @  18.7.2010,  19:49 Найти цитируемый пост)
бесят такие темы, когда люди пишут "зачем ххх" не понимая зачем оно надо.

Реальный сценарий, где нужны целые числа фиксированной размерности больше, чем 2^31 в студию!

Это сообщение отредактировал(а) kemiisto - 18.7.2010, 18:54


--------------------
PM MAIL WWW GTalk Jabber   Вверх
Void
Дата 18.7.2010, 19:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

Репутация: 11
Всего: 173



Цитата(kemiisto @  18.7.2010,  20:51 Найти цитируемый пост)
Зачем язык усложнять, если оне не актуально. Ладно для системных ЯП.

Чем тебе C# не системный ЯП со своим unsafe? А Java была спроектирована в те времена, когда так разбрасываться памятью, как ты предлагаешь, было нельзя, особенно на кофеварках.

Кстати, ещё один тип понадобится в любом языке — это массив байтов. А раз есть массив, значит и байт должен быть. Можно конечно его сделать неарифметическим типом. Но над такими вещами в мэйнстриме не слишком давно задумываться стали.


--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
kemiisto
Дата 18.7.2010, 19:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дикий Кот. =^.^=
****
Награды: 1



Профиль
Группа: Участник Клуба
Сообщений: 3292
Регистрация: 29.7.2007

Репутация: 3
Всего: 160



Цитата(Void @  18.7.2010,  20:04 Найти цитируемый пост)
Чем тебе C# не системный ЯП со своим unsafe? А Java была спроектирована в те времена, когда так разбрасываться памятью, как ты предлагаешь, было нельзя, особенно на кофеварках.

Вот теперь я понял...


Цитата(Void @  18.7.2010,  19:35 Найти цитируемый пост)
А в системном языке в любом случае нужен будет полный набор int|uint{8,16,32,64}, потому что API и протоколы.

Надо менять API и протоколы! smile 


--------------------
PM MAIL WWW GTalk Jabber   Вверх
Abyx
Дата 19.7.2010, 11:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 601
Регистрация: 3.11.2009

Репутация: нет
Всего: 10



kemiisto, вы на каком языке пишете? php и js? вот и пишите себе молча


Цитата(kemiisto @  18.7.2010,  18:51 Найти цитируемый пост)
Чего огород городить со всякими явными приведениями типов, checked/unchecked и т.п.?

Есть такие области программирования, где надо работать с числами. конечной разрядности.

Бинарные протоколы. Там данные имеют заданную длину в байтах. Когда я смотрю код на джаве типа "x = ReadInt32()" мне становится как-то не по себе %)

Криптография, и прочие задачи где надо "ксорить и складывать дворды", причем беззнаковые и с переполнением (unchecked).

Упаковка данных в памяти. Бывают ситуации, когда данных сравнительно больше чем памяти. По этому их надо упаковывать так чтобы количество двоичных разрядов было близко к количеству бит.
Вообще любые оптимизации по памяти, за счет того что программисту надо потрудиться и указать подходящий размер типа.

Цитата(kemiisto @  18.7.2010,  18:03 Найти цитируемый пост)
Хочу один целочисленный знаковый тип фиксированной разрядности. 32-битный. Назовём его Int. 

вы вообще понимаете почему сейчас "популярен" int32 а не int16 как лет 15-20 назад?
вам в голову не приходило, что использование int32 на 64 разрядной машине - это снижение производительности?
а то что индекс массива может занимать больше 31 разряда? (понятие указатель вам наверное непонятно)

Цитата(kemiisto @  18.7.2010,  18:51 Найти цитируемый пост)
Реальный сценарий, где нужны целые числа фиксированной размерности больше, чем 2^31 в студию!

0. размер файла.
1. флаги. SOME_FLAG = 0x800000000000;
2. числа, большие чем 2^31. Вы умеете считать только до 2^31 ?
когда сделали Ip адреса 32разрядными, тоже думали что этого хватит
3. произведения чисел больших 100'000. вам вообще приходилось когда-нибудь чтонибудь считать? умножать например. причем считать точно, а не использовать вещественные с плавающей точкой.
4. однажды в одной игре (ММОРПГ) количество предметов хранили в signed int32, сервер был написан на С++ и работал на win32. Потом некоторые игроки накопили больше чем 2^31 предметов, они переполнились и пропали. Сервер перенесли на win64.

погуглите "__int64" и вы найдете применения int64



вобщем если вы занимаетесь формошлепством, делаете сайтики, то вам в самом деле наплевать на то какого размера типы данных.
а те кому надо - тем надо.
PM MAIL   Вверх
Abyx
Дата 19.7.2010, 11:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 601
Регистрация: 3.11.2009

Репутация: нет
Всего: 10



вообще это здравая мысль, абстрагироваться от размера типа

например надо хранить количество яблок в корзине. для этого совершенно не важны тип и размер переменной, лишь бы в нее можно было хранить значения от 0 до 1000

но для этого вводят новые типы, например apples_count_t, а не выкидывают из языка старые.

для начала можно написать
typedef int apples_count_t 
и использовать этот новый тип для хранения количества яблок

потом можно безболезненно провести оптимизацию по быстродействию под различные платформы
Код

#if defined(X16)
typedef int16_t apples_count_t 
#elif defined(X32)
typedef int32_t apples_count_t 
#elif defined(X64)
typedef int64_t apples_count_t 
#endif

PM MAIL   Вверх
djamshud
Дата 19.7.2010, 11:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Пердупержденный
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 23.11.2009

Репутация: 1
Всего: 39



Кхм. Ну так не нравится, не ешь. #define int int32_t.

Во-первых, как уже резонно заметили, на современном процессоре в 64-битном режиме работы 32-битное число - это проседание производительности. Во-вторых три мегабайта - фигня в рамках одного массива. А сколько их может быть одновременно (строки тоже считаем, ведь так?)... Так вы предалагаете вообще глобально использовать 32-бит на инт. Интересно будет посмотреть, как люто бешенно выжирается память, когда _весь_ софт начнет так работать.

>Надо менять API и протоколы!

И пусть весь хедер вплоть до IP-заголовка поместится в Ethernet-кадр! :D

>Экономия памяти таких масштабов (скажем, 1 млн. 32-битных целых против 1 млн. 8-битных - целых 3(!) МБ памяти) имела смысл в 70-е.

В начале 90-х только к мегабайту ОЗУ подбирались, насколько я помню из Just For Fun-а:).

Добавлено @ 11:49
Abyx, а вот яблоки проще хранить и вкуснее уплетать за обе щеки в более других языках с динамической типизацией, по-моему.

Это сообщение отредактировал(а) djamshud - 19.7.2010, 11:49


--------------------
'Cuz I never walk away from what I know is right
Alice Cooper - Freedom
PM   Вверх
Abyx
Дата 19.7.2010, 11:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 601
Регистрация: 3.11.2009

Репутация: нет
Всего: 10



алсо в современных языках с выводом типов в большинстве случаев не приходится думать о размерах типов чисел
например в F# по умолчанию int32
Код

> let x = 1;;

val x : int = 1

PM MAIL   Вверх
kemiisto
Дата 19.7.2010, 12:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дикий Кот. =^.^=
****
Награды: 1



Профиль
Группа: Участник Клуба
Сообщений: 3292
Регистрация: 29.7.2007

Репутация: 3
Всего: 160



Цитата(Abyx @  19.7.2010,  12:00 Найти цитируемый пост)
kemiisto, вы на каком языке пишете? php и js? вот и пишите себе молча

Fortran, Oberon, скоро будем на Scala.


Abyx, я не о системных ЯП говорю. Лады. Там мы вынужденны весь огород оставить. Но для прикладного (во всех проявлениях) программирования... Неужели оно нужно?

Цитата(Abyx @  19.7.2010,  12:00 Найти цитируемый пост)
вы вообще понимаете почему сейчас "популярен" int32 а не int16 как лет 15-20 назад?

Не надо считать меня за дурака.

Цитата(Abyx @  19.7.2010,  12:00 Найти цитируемый пост)
вам в голову не приходило, что использование int32 на 64 разрядной машине - это снижение производительности?

Приходило, гуглил. Это миф. Давайте пруфлинк.


Цитата(Abyx @  19.7.2010,  12:00 Найти цитируемый пост)
0. размер файла.
1. флаги. SOME_FLAG = 0x800000000000;
2. числа, большие чем 2^31. Вы умеете считать только до 2^31 ?
когда сделали Ip адреса 32разрядными, тоже думали что этого хватит
3. произведения чисел больших 100'000. вам вообще приходилось когда-нибудь чтонибудь считать? умножать например. причем считать точно, а не использовать вещественные с плавающей точкой.
4. однажды в одной игре (ММОРПГ) количество предметов хранили в signed int32, сервер был написан на С++ и работал на win32. Потом некоторые игроки накопили больше чем 2^31 предметов, они переполнились и пропали. Сервер перенесли на win64.

1) Системная штуковина. См. выше.
2) Я же сказал: если нужны числа большие 2^31 для счёта, то в 99,999% нужна длинная арифметика. а не 2^63.
3) Мне приходилось считать и не такое. Опять же тут нужна длинная арифметика.
4) Больше чем 2^31 предметов??? Я правда это вижу? Или сон?

Цитата(Abyx @  19.7.2010,  12:58 Найти цитируемый пост)
алсо в современных языках с выводом типов в большинстве случаев не приходится думать о размерах типов чисел

Вывод типов есть не во всех языках...


--------------------
PM MAIL WWW GTalk Jabber   Вверх
Abyx
Дата 19.7.2010, 13:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 601
Регистрация: 3.11.2009

Репутация: нет
Всего: 10



Цитата(kemiisto @  19.7.2010,  12:14 Найти цитируемый пост)
Приходило, гуглил. Это миф. Давайте пруфлинк.

дайте пруфлинк что миф)
либо мы будем использовать префиксы для 32разрядных команд, либо мы будем юзать 64разрядные регистры и программно проверять переполнение и прочие флаги

Цитата(kemiisto @  19.7.2010,  12:14 Найти цитируемый пост)
2) Я же сказал: если нужны числа большие 2^31 для счёта, то в 99,999% нужна длинная арифметика. а не 2^63.
3) Мне приходилось считать и не такое. Опять же тут нужна длинная арифметика.

производительность длинной арифметики, реализованной программно на порядки ниже чем аппаратное умножение двух int64 на 64-разрядной машине

Цитата(kemiisto @  19.7.2010,  12:14 Найти цитируемый пост)
4) Больше чем 2^31 предметов??? Я правда это вижу? Или сон?

Это вполне реальная ситуация. Имеются ввиду предметы 1 типа. Деньги например.

Добавлено через 1 минуту и 37 секунд
Цитата(kemiisto @  19.7.2010,  12:14 Найти цитируемый пост)
Вывод типов есть не во всех языках... 

я же написал, во всех современных языках.
а то что вы юзаете всякое старье типа оберона с фортраном - ваши проблемы
PM MAIL   Вверх
kemiisto
Дата 19.7.2010, 13:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дикий Кот. =^.^=
****
Награды: 1



Профиль
Группа: Участник Клуба
Сообщений: 3292
Регистрация: 29.7.2007

Репутация: 3
Всего: 160



Цитата(Abyx @  19.7.2010,  14:16 Найти цитируемый пост)
дайте пруфлинк что миф)

Нет уж, товарисчъ Трололо. Заявление было Ваше, так что и пруф с Вас.

Цитата(Abyx @  19.7.2010,  14:16 Найти цитируемый пост)
производительность длинной арифметики, реализованной программно на порядки ниже чем аппаратное умножение двух int64 на 64-разрядной машине

Блин. Я же говорю: в тех случаях, когдане хватает int32, задача в 99% случаев такая, чтои int64 не хватит. Придётся использовать длинную арифметику. smile 

Цитата(Abyx @  19.7.2010,  14:16 Найти цитируемый пост)
Это вполне реальная ситуация. Имеются ввиду предметы 1 типа. Деньги например.

Либо использовать длинную арифметику, либо проводить деноминацию. smile 

Цитата(Abyx @  19.7.2010,  14:16 Найти цитируемый пост)
я же написал, во всех современных языках.
а то что вы юзаете всякое старье типа оберона с фортраном - ваши проблемы

Ой, как толсто! smile 


--------------------
PM MAIL WWW GTalk Jabber   Вверх
Void
Дата 19.7.2010, 13:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

Репутация: 11
Всего: 173



Цитата(Abyx @  19.7.2010,  15:16 Найти цитируемый пост)
либо мы будем использовать префиксы для 32разрядных команд, либо мы будем юзать 64разрядные регистры и программно проверять переполнение и прочие флаги

Если речь об x86-64, то префикс REX как раз нужен, чтобы получить доступ к 64-разрядным регистрам.


--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
Abyx
Дата 19.7.2010, 15:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 601
Регистрация: 3.11.2009

Репутация: нет
Всего: 10



радует одно: толку от это этой темы  - нет никакого, никто не побежит править языки
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила ведения Религиозных войн
Smartov
1. Уважайте собеседника
2. Собеседник != враг
3. Старайтесь воздерживаться от тем вида "Windows Rulez" или "Linux Rulez"

С уважением, Smartov.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Религиозные войны | Следующая тема »


 




[ Время генерации скрипта: 0.1274 ]   [ Использовано запросов: 23 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.