Модераторы: 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   Вверх
k0rvin
Дата 19.7.2010, 20:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



меня в CL, Scheme и Haskell всё устраивает, а С и С++ -- языки системного программирования, там видимо такое оправдано


--------------------
“Object-oriented design is the roman numerals of computing.” — Rob Pike
All software sucks
PM MAIL   Вверх
nickless
Дата 20.7.2010, 02:28 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Гентозавр
****


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

Репутация: 2
Всего: 181



В принципе упростить прикладные языки конечно можно, но:

1. Работать с "нестандартными" задачами на таком языке будет сложнее (а длинная арифметика будет неудобнее и в разы медленнее, что далеко не всегда приемлимо), т.е. теряется универсальность
2. Не, ну почему 32 бита?? Это сейчас, когда количество памяти сжираемой программами уже нередко превышает гигабайты? Ты же даже DVD до конца досмотреть не сможешь без длинной арифметики, не говоря уже о файлах, базах данных, и таких незаметных вещах вроде скорости сети (а 1GBit/s = 2^30 bit)
3. Как ты собираешься работать с текстом (UTF-8, UTF-16, UTF-32 smile ), массивами данных (просто byte array), графикой (пиксель = 3 цвета по 1 байту), музыкой (куча форматов), видео (еще больше форматов), сетью (а, ну да, всё перепишем), другими языками (их прийдётся тоже в топку), операционными системами (там системные языки, но вызывать-то их API как-то надо)...

Хотя чтобы скриптик наваять там, или страничку в вебе хватит, но... как раз там используемые языки уже всё упростили smile 


--------------------
user posted image

Real men don't use backups, they post their stuff on a public ftp server and let the rest of the world make copies
- Linus Torvalds
PM MAIL   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила ведения Религиозных войн
Smartov
1. Уважайте собеседника
2. Собеседник != враг
3. Старайтесь воздерживаться от тем вида "Windows Rulez" или "Linux Rulez"

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

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


 




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


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

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