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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Преобразование из QString в qint64  (Прочитано 14730 раз)
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
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



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

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


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