Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: тип __int64  (Прочитано 24748 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« : 22-09-2005 06:06 » 

ещё вопросик

какие операции возможны с типом __int64 ?

например я делаю

__int64 d,d1;
d=0xffffffffffffffff;
d1=d/2;
d1=d-2;

результат деления - ноль (косяк то есть), а вычитание нормально

операция сдвига >> тоже не катит

вообще - если мне нужна 64 битная переменная, является ли __int64 хорошим выбором?
Записан

NetRaider
Гость
« Ответ #1 : 22-09-2005 06:50 » 

Цитата
ещё вопросик

какие операции возможны с типом __int64 ?

например я делаю

__int64 d,d1;
d=0xffffffffffffffff;
d1=d/2;
d1=d-2;

результат деления - ноль (косяк то есть), а вычитание нормально

операция сдвига >> тоже не катит

вообще - если мне нужна 64 битная переменная, является ли __int64 хорошим выбором?


0xffffffffffffffff - представляет собой 'integer literal'(если точнее - 'hexadecimal-literar')
Такой литерал может быть представлен одним из следующих типов: int, unsigned int, long int, unsigned long int.
В данном случае (зависит от реализации) такое представление невозможно.
Таким образом програама не является кооректной.
Но возможно(опять же зависит от компилятора) из-за переполнения значение d получается равным -1, а -1/2=0 (для int).

__int64 не является стандартным типов, за подробностями нужно обращаться в MSDN,
но я думаю что к этому типу применимы все операции, аналогичные для 'int'.
« Последнее редактирование: 20-12-2007 17:20 от Алексей1153++ » Записан
Alf
Гость
« Ответ #2 : 22-09-2005 07:10 » 

...
операция сдвига >> тоже не катит

Исчерпывающее описание проблемы.

Что ожидается получить и что получается на самом деле?

вообще - если мне нужна 64 битная переменная, является ли __int64 хорошим выбором?

Смотря что ты от нее хочешь получить. Хотя, конечно, вопрос для другой ветки, этот тип специфичен для MS VC.
Записан
NetRaider
Гость
« Ответ #3 : 22-09-2005 07:15 » new

Немного недосмотрел - скорее всего банальное переполнение, т.к. 0xffffffffffffffff физически не может поместиться в __int64.

И все-равно, если литерал '0xffffffffffffffff' не может быть представлен типом 'unsigned long int', то программа является 'ill-formed'. Но это в теории, а так зависит от компилятора.
« Последнее редактирование: 20-12-2007 17:22 от Алексей1153++ » Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #4 : 22-09-2005 07:46 » 

> 0xffffffffffffffff - представляет собой
> 'integer literal'(если точнее - 'hexadecimal-literar')

- да мне какая разница, что он представляет Улыбаюсь в переменную-то грузится нормально.

Альф, переменная является хранилищем суммы множества целых положительных чисел. Это мне надо для упрощения динамического вычисления среднего значения огромного количества чисел, числа постоянно "приходят". То есть тут я коплю сумму, а в другой переменной - количество чисел. Естественно, DWORD переполниться, пусть не скоро ( через годик по подсчётам), и придётся произвести сброс (я просто сделал деление обоих переменных на количество чисел, тогда среднее число на границе не прыгает).

И возникла мысль - аможет быть удасться без усложнений юзать 64 битную переменную? Ведь тогда навечно Улыбаюсь

Но если не удасться - фиг с ней.

А. В расчётах среднего присутствует деление - и оно работает с 64 неправильно.
> Исчерпывающее описание проблемы.

короче, результатом деления или побитового сдвига я вляется ноль. В то время как сожение и вычитание нормально работает (переполнение учитывается)

NetRaider ,
>физически не может поместиться в __int64

64 бита очень неплохо помещаются в 64-битную переменную Ага


« Последнее редактирование: 20-12-2007 17:27 от Алексей1153++ » Записан

NetRaider
Гость
« Ответ #5 : 22-09-2005 08:03 » 

64 бита очень неплохо помещаются в 64-битную переменную Ага

hint: Согласен, но 0xffffffffffffffff неплохо помещается толко в unsigned  __int64  Улыбаюсь
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #6 : 22-09-2005 08:16 » 

NetRaider , Улыбаюсь в натуре Улыбаюсь  деление и сдвиг теперь работает

------
остался один моментик - насколько безопасно пользоваться этим типом
« Последнее редактирование: 22-09-2005 08:17 от Алексей1153 » Записан

Alf
Гость
« Ответ #7 : 22-09-2005 08:17 » 

...
короче, результатом деления или побитового сдвига я вляется ноль. В то время как сожение и вычитание нормально работает (переполнение учитывается)

Леха, твое любимое число 0xffffffffffffffff для знакового целого является всего лишь минус единицей. Что ты еще ожидаешь получить от деления единицы пополам?

Объяви свою переменную как unsigned  __int64, и будет тебе щастье. Много.
Записан
NetRaider
Гость
« Ответ #8 : 22-09-2005 08:18 » 


остался один моментик - насколько безопасно пользоваться этим типом


Что значит безопасно?
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #9 : 22-09-2005 08:19 » 

Alf про щасте я уде понял, теперь про неопасность скажи Улыбаюсь - мона?
Записан

Alf
Гость
« Ответ #10 : 22-09-2005 08:24 » 

А какого подвоха ты ожидаешь? Какую опасность может таить в себе переменная, пусть и нестандартного типа? Диск не отформатирует, блок питания не спалит.

Спроси конкретнее, так непонятно совершенно.
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #11 : 22-09-2005 08:28 » 

> Спроси конкретнее

- да не знаю яконкретнее, просто я первый раз собираюсь этот тип применить, а может кто пользовался и какие-то приколы нехорошие про него знает?

ну если всё ок - тогда вперёд, на мины Улыбаюсь
собственно мне нужны только простые арифметические операции
Записан

npak
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #12 : 23-09-2005 07:14 » 

Проблем быть не должно.  Для 32-х разрядных процессоров компилятор сгенерирует необходимый код для арифметических операций.

Если нужна переносимость между компиляторами, то введи свой тип, например MYINT64.  Для MS VC задай
typedef _int64 MYINT64;
Для gcc
typedef longlong int MYINT64;

Оба компилятора поддерживают все арифметические операторы, включая сдвиги и присваивания (+= и т.п.)
Записан

UniTesK -- индустриальная технология надежного тестирования.

http://www.unitesk.com/ru/
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #13 : 23-09-2005 07:21 » 

понял Улыбаюсь
Записан

Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines