Russian Qt Forum
Ноябрь 24, 2024, 21:41 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Преобразование из QString в qint64  (Прочитано 13980 раз)
8Observer8
Гость
« : Март 14, 2014, 12:35 »

Привет!

Корректно ли такое преобразование из QString в qint64 с помощью метода toULongLong()? Если нет, то какой способ лучше?

Заранее спасибо за ответ.

Код
C++ (Qt)
#include <QCoreApplication>
#include <QDateTime>
#include <QDebug>
 
int main(int argc, char *argv[])
{
   QCoreApplication a(argc, argv);
 
   QString str("1394790029894");
 
   qint64 t = str.toULongLong();
 
   QDateTime time;
   time.setMSecsSinceEpoch(t);
 
   qDebug() << time.toString();
 
   return a.exec();
}
 
Записан
OKTA
Гость
« Ответ #1 : Март 14, 2014, 13:11 »

Чем не преобразование?  Улыбающийся
Разве что quint64 вместо qint64, раз toULongLong используешь
Записан
Johnik
Крякер
****
Offline Offline

Сообщений: 339


Просмотр профиля
« Ответ #2 : Март 14, 2014, 13:19 »

qglobal.h
Код:
typedef qint64 qlonglong;
typedef quint64 qulonglong;
Записан
8Observer8
Гость
« Ответ #3 : Март 14, 2014, 13:31 »

Я думал, что toULongLong() не гарантирует, что он вернёт 64-x разрядное число. По сообщению Johnik вижу, что разрядность гарантирванно совпадает. Несмотря на то, что метод setMSecsSinceEpoch() принимает qint64, а мы ему подсунем quint64, ничего страшного не произойдёт. Неявное преобразование из quint64 в qint64 - безопасно, так как не происходит усечения значения. Всем спасибо большое! Улыбающийся
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #4 : Март 14, 2014, 14:31 »

Несмотря на то, что метод setMSecsSinceEpoch() принимает qint64, а мы ему подсунем quint64, ничего страшного не произойдёт. Неявное преобразование из quint64 в qint64 - безопасно, так как не происходит усечения значения. Всем спасибо большое! Улыбающийся
это то же самое, как если сказать «если мы методу, принимающему char, подсунем unsigned char, то ведь ничего страшного не произойдёт». вот подсунь такому методу число 128 и узнаешь Подмигивающий
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
OKTA
Гость
« Ответ #5 : Март 14, 2014, 14:59 »

Откройте мне глаза! Когда используется обратный код, а когда дополнительный?
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #6 : Март 14, 2014, 15:01 »

обратный код — это просто инвертирование битов числа (унарный оператор ~), а дополнительный — умножение на -1 (к инвертированному числу добавить 1)

нет, кажется наоборот (термины перепутал)
« Последнее редактирование: Март 14, 2014, 15:03 от kambala » Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
OKTA
Гость
« Ответ #7 : Март 14, 2014, 15:04 »

Да нет, вроде не перепутал, все верно!

Знаковые переменные хранятся в дополнительном коде, верно?
« Последнее редактирование: Март 14, 2014, 15:08 от OKTA » Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #8 : Март 14, 2014, 15:17 »

отрицательные значения — да
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
8Observer8
Гость
« Ответ #9 : Март 14, 2014, 17:17 »

Я понял о чём речь. Если мы попытаемся привести число 128 типа "unsigned char" к типу "signed char", то получим выход за диапазон допустимых значений:

unsigned char: [0, 255]
signed char: [-128, 127]
Записан
OKTA
Гость
« Ответ #10 : Март 14, 2014, 18:02 »

Попробуй и посмотри, что будет  Улыбающийся

Код:
int main()
{   
    char a;
    a = 128;
    printf ("%d", a);
    return 0;
}
Записан
8Observer8
Гость
« Ответ #11 : Март 14, 2014, 18:16 »

Если написать просто "char", то система решит, что это "signed char". 128 - это выход за допустимый диапазон для "signed char". Поэтому нужно явно указать "unsigned char":

Код
C++ (Qt)
#include <QCoreApplication>
#include <stdio.h>
 
int main(int argc, char *argv[])
{
   QCoreApplication app(argc, argv);
 
   unsigned char a;
   a = 128;
   printf ("%d", a);
 
   return app.exec();
}
 
Записан
OKTA
Гость
« Ответ #12 : Март 14, 2014, 18:18 »

Но таки работать будет  Улыбающийся
Записан
8Observer8
Гость
« Ответ #13 : Март 14, 2014, 18:29 »

Зависит от системы. На моей системе "char" преобразуется к "signed char", поэтому если написать: "char a;", то вывод будет: "-128". Если написать явно: "unsigned char a;", то вывод будет: 128

На других системах "char" преобразуется к "unsigned char", поэтому вывод будет: 128

Интересно, что в стандарте написано по этому поводу? Может там написано, что "char" преобразуется либо к "unsigned char", либо "signed char" - на усмотрение разработчиков компиляторов?
Записан
Old
Джедай : наставник для всех
*******
Online Online

Сообщений: 4350



Просмотр профиля
« Ответ #14 : Март 14, 2014, 18:34 »

На других системах "char" преобразуется к "unsigned char", поэтому вывод будет: 128
Это на каких таких системах? Улыбающийся
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.093 секунд. Запросов: 23.