| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Visual C++/MFC/WTL > Long Long в MSVC 1.5 |
| Автор: x8m6 22.1.2012, 16:14 | ||||
Компилю код компилятором Microsoft Visual C++ 1.5. В коде объявлена константа типа long long:
При компиляции через NMAKE появляется ошибка:
|
| Автор: Daevaorn 22.1.2012, 16:29 |
| В чем вопрос? |
| Автор: x8m6 22.1.2012, 16:50 | ||
Как решить проблему или как в VC++ 1.5 задать такую константу? |
| Автор: borisbn 22.1.2012, 21:12 |
| Есть подозрение, что в 1983-м году студия была 16-битной и в ней просто не было возможности задавать 64-х битные числа. Выбери студию поновее. У них есть и http://www.microsoft.com/visualstudio/en-us/products/2010-editions/express |
| Автор: x8m6 22.1.2012, 23:25 |
| borisbn, ты думаешь что я настолько отстал от жизни что пишу на студии 1983 года? Нет. Просто нужно скомпилить одну часть проекта этим компилятором. |
| Автор: volatile 23.1.2012, 00:28 | ||
x8m6, попробуйте написать так
Если не прокатит, то значит там действительно еще нет поддержки 64-разрядных чисел. Остается в этом случае писать свою библиотеку 64-разрядной арифметики Вообще-то это не не так и сложно.. Только зачем? Ради спортивного итереса? |
| Автор: Dem_max 23.1.2012, 08:50 |
| Я думаю не поможет |
| Автор: x8m6 23.1.2012, 14:00 |
| volatile, не помогло. Хорошо, тогда немного другой вопрос. Как записать 64 битное число двумя 32 битными (low and high части)? Если поможете кодом буду только рад. |
| Автор: borisbn 23.1.2012, 14:41 | ||
|
| Автор: x8m6 23.1.2012, 20:13 | ||
Я наверно не правильно вопрос поставил. Как вычислить 32-битные low и high части от 64-битного числа. Т.е. нужна функция:
|
| Автор: x8m6 24.1.2012, 10:43 | ||
Вот на этом примере почему то не работает:
Если вместо 11386655755 поставить 77356848298 то все нормально вычисляется. В чем дело? |
| Автор: borisbn 24.1.2012, 10:49 |
| замени везде int на unsigned int и всё будет ОК. http://liveworkspace.org/code/060f4e9f7f426f6298dd562dc55a5885 Дело в том, что при сдвиге знакового числа заполнение "слева" идёт не нулями, а знаковым битом. Грубо говоря, в int не 32 значащих бита, а 31 и один - для определения знака числа. Ты же пытаешься записать в int все 32 бита, и у тебя получается, что 31 записываются как значащие, а один (изначально тоже значащий) - как знак. |
| Автор: x8m6 24.1.2012, 11:44 | ||
Еще очень нужна функция целочисленного деления:
|
| Автор: borisbn 24.1.2012, 11:49 |
res = num / divider; // res - целая часть от деления num на divider при условии, что и num и divider - целые res = num % divider; // res - остаток от деления num на divider x8m6, скажи честно, ты хоть одну книгу открыл по Си++ ? |
| Автор: x8m6 24.1.2012, 12:57 | ||
| borisbn, мне нужно непростое целочисленное деление как видишь. num нужно разложить на две uint32 части. Их поделить на divider, а потом опять собрать в int64. Как собирать и разбирать я уже знаю. А вот как поделить нет. Т.е. у меня сомнения по поводу этого кода:
Книги открывал, и не одну. |
| Автор: borisbn 24.1.2012, 13:13 |
не очень понял, зачем всё это нужно, но, судя по описанию, в коде всё правильно, за исключением Д.б. unsigned int. Откажись от знаковых чисел, если тебе в принципе не нужны отрицательные |
| Автор: x8m6 24.1.2012, 15:51 |
| Все таки как - то по другому надо делить http://liveworkspace.org/code/63b7e6059aa38de3eb38f413add3a62d |
| Автор: volatile 25.1.2012, 01:07 | ||||
Ну естественно так делить нельзя. во 2 классе, кажется учат делить столбиком. Вот столбиком и нужно делить, а не каждую цифру. Это тот случай, когда на асме сделать проще.
liveworkspace асма не понимает, (или я не знаю как там надо писать) Проверил на студии выборочно, вроде работает Если кто напишет на С/С++, тоже самое но короче, мое уважение, и плюс в репу! (естественно без привлечения 64-разрядной арифметики) |
| Автор: x8m6 25.1.2012, 22:52 |
| volatile, что то не робит. переменные lo и hi не изменяются вообще |
| Автор: volatile 25.1.2012, 23:10 |
| x8m6, а они и не должны меняться. результат функции в edx:eax это и есть возврат функции unsigned long long func(); |
| Автор: volatile 25.1.2012, 23:45 |
| Ну если вам нужен результат в lo, hi (чтоб убедиться что работает) Допишите в самом конце: mov hi, edx mov lo, eax |