![]() |
|
![]() ![]() ![]() |
|
x8m6 |
|
||||
Бывалый ![]() Профиль Группа: Участник Сообщений: 156 Регистрация: 11.12.2008 Репутация: нет Всего: нет |
Компилю код компилятором Microsoft Visual C++ 1.5. В коде объявлена константа типа long long:
При компиляции через NMAKE появляется ошибка:
|
||||
|
|||||
Daevaorn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2155 Регистрация: 29.11.2004 Где: Москва Репутация: нет Всего: 70 |
В чем вопрос?
|
|||
|
||||
x8m6 |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 156 Регистрация: 11.12.2008 Репутация: нет Всего: нет |
Как решить проблему или как в VC++ 1.5 задать такую константу? |
|||
|
||||
borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 2 Всего: 135 |
Есть подозрение, что в 1983-м году студия была 16-битной и в ней просто не было возможности задавать 64-х битные числа.
Выбери студию поновее. У них есть и бесплатная версия -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
x8m6 |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 156 Регистрация: 11.12.2008 Репутация: нет Всего: нет |
borisbn, ты думаешь что я настолько отстал от жизни что пишу на студии 1983 года? Нет. Просто нужно скомпилить одну часть проекта этим компилятором.
|
|||
|
||||
volatile |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 4 Всего: 85 |
x8m6, попробуйте написать так
Если не прокатит, то значит там действительно еще нет поддержки 64-разрядных чисел. Остается в этом случае писать свою библиотеку 64-разрядной арифметики ![]() Вообще-то это не не так и сложно.. Только зачем? Ради спортивного итереса? |
|||
|
||||
Dem_max |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1780 Регистрация: 12.4.2007 Репутация: 1 Всего: 39 |
Я думаю не поможет
-------------------- Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte") |
|||
|
||||
x8m6 |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 156 Регистрация: 11.12.2008 Репутация: нет Всего: нет |
volatile, не помогло.
Хорошо, тогда немного другой вопрос. Как записать 64 битное число двумя 32 битными (low and high части)? Если поможете кодом буду только рад. |
|||
|
||||
borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 2 Всего: 135 |
Это сообщение отредактировал(а) borisbn - 23.1.2012, 14:42 -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
x8m6 |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 156 Регистрация: 11.12.2008 Репутация: нет Всего: нет |
Я наверно не правильно вопрос поставил. Как вычислить 32-битные low и high части от 64-битного числа. Т.е. нужна функция:
|
|||
|
||||
volatile |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 4 Всего: 85 |
||||
|
||||
x8m6 |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 156 Регистрация: 11.12.2008 Репутация: нет Всего: нет |
Вот на этом примере почему то не работает:
Если вместо 11386655755 поставить 77356848298 то все нормально вычисляется. В чем дело? |
|||
|
||||
borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 2 Всего: 135 |
замени везде int на unsigned int и всё будет ОК.
http://liveworkspace.org/code/060f4e9f7f42...8dd562dc55a5885 Дело в том, что при сдвиге знакового числа заполнение "слева" идёт не нулями, а знаковым битом. Грубо говоря, в int не 32 значащих бита, а 31 и один - для определения знака числа. Ты же пытаешься записать в int все 32 бита, и у тебя получается, что 31 записываются как значащие, а один (изначально тоже значащий) - как знак. Это сообщение отредактировал(а) borisbn - 24.1.2012, 10:52 -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
x8m6 |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 156 Регистрация: 11.12.2008 Репутация: нет Всего: нет |
Еще очень нужна функция целочисленного деления:
|
|||
|
||||
borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 2 Всего: 135 |
res = num / divider; // res - целая часть от деления num на divider при условии, что и num и divider - целые res = num % divider; // res - остаток от деления num на divider x8m6, скажи честно, ты хоть одну книгу открыл по Си++ ? -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
x8m6 |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 156 Регистрация: 11.12.2008 Репутация: нет Всего: нет |
borisbn, мне нужно непростое целочисленное деление как видишь. num нужно разложить на две uint32 части. Их поделить на divider, а потом опять собрать в int64. Как собирать и разбирать я уже знаю. А вот как поделить нет.
Т.е. у меня сомнения по поводу этого кода:
Книги открывал, и не одну. Это сообщение отредактировал(а) x8m6 - 24.1.2012, 13:03 |
|||
|
||||
borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 2 Всего: 135 |
не очень понял, зачем всё это нужно, но, судя по описанию, в коде всё правильно, за исключением Д.б. unsigned int. Откажись от знаковых чисел, если тебе в принципе не нужны отрицательные -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
x8m6 |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 156 Регистрация: 11.12.2008 Репутация: нет Всего: нет |
Все таки как - то по другому надо делить
http://liveworkspace.org/code/63b7e6059aa3...b38f413add3a62d |
|||
|
||||
volatile |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 4 Всего: 85 |
Ну естественно так делить нельзя. во 2 классе, кажется учат делить столбиком. Вот столбиком и нужно делить, а не каждую цифру. Это тот случай, когда на асме сделать проще.
liveworkspace асма не понимает, (или я не знаю как там надо писать) Проверил на студии выборочно, вроде работает Если кто напишет на С/С++, тоже самое но короче, мое уважение, и плюс в репу! (естественно без привлечения 64-разрядной арифметики) Это сообщение отредактировал(а) volatile - 25.1.2012, 01:11 |
|||
|
||||
x8m6 |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 156 Регистрация: 11.12.2008 Репутация: нет Всего: нет |
volatile, что то не робит. переменные lo и hi не изменяются вообще
|
|||
|
||||
volatile |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 4 Всего: 85 |
x8m6, а они и не должны меняться.
результат функции в edx:eax это и есть возврат функции unsigned long long func(); |
|||
|
||||
volatile |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 4 Всего: 85 |
Ну если вам нужен результат в lo, hi (чтоб убедиться что работает)
Допишите в самом конце: mov hi, edx mov lo, eax |
|||
|
||||
![]() ![]() ![]() |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |