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

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

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

Это на каких таких системах? Улыбающийся

OKTA же написал:

Но таки работать будет  Улыбающийся

Отсюда можно сделать вывод, что у него работает и выводит: 128
Записан
OKTA
Гость
« Ответ #16 : Март 14, 2014, 18:42 »

Я хотел сказать, что никаких ошибок выхода за диапазон значений не будет )))

насчет signed-unsigned можно заглянуть в такой файл limits.h. В нем должна быть достоверная информация, на сколько мне известно)
Вот, что у меня понаписали)
Код:
#define CHAR_BIT      8         /* number of bits in a char */
#define SCHAR_MIN   (-128)      /* minimum signed char value */
#define SCHAR_MAX     127       /* maximum signed char value */
#define UCHAR_MAX     0xff      /* maximum unsigned char value */

#ifndef _CHAR_UNSIGNED
#define CHAR_MIN    SCHAR_MIN   /* mimimum char value */
#define CHAR_MAX    SCHAR_MAX   /* maximum char value */
#else
#define CHAR_MIN      0
#define CHAR_MAX    UCHAR_MAX
#endif  /* _CHAR_UNSIGNED */

А еще вот)
из http://cpp0x.centaur.ath.cx/basic.fundamental.html

3.9.1 Fundamental types

1Objects declared as characters (char) shall be large enough to store any member of the implementation’s basic character set. If a character from this set is stored in a character object, the integral value of that character object is equal to the value of the single character literal form of that character. It is implementation-defined whether a char object can hold negative values. Characters can be explicitly declared unsigned or signed. Plain char, signed char, and unsigned char are three distinct types. A char, a signed char, and an unsigned char occupy the same amount of storage and have the same alignment requirements (3.11); that is, they have the same object representation. For character types, all bits of the object representation participate in the value representation. For unsigned character types, all possible bit patterns of the value representation represent numbers. These requirements do not hold for other types. In any particular implementation, a plain char object can take on either the same values as a signed char or an unsigned char; which one is implementation-defined.
« Последнее редактирование: Март 14, 2014, 18:50 от OKTA » Записан
8Observer8
Гость
« Ответ #17 : Март 14, 2014, 18:48 »

Как же не будет? А что это тогда, если не ошибка? Я хочу вывести 128: "char a = 128;" А на экране вижу: -128. Это произошло из-за выхода из допустимого диапазона, который для signed char: [-128; 127]. Поэтому и нужно было явно написать: "unsigned char a = 128;"

По поводу "других систем" я перепутал с расширением знака при преобразовании из char в int.
Записан
8Observer8
Гость
« Ответ #18 : Март 14, 2014, 19:04 »

Кто может кроме программиста определить _CHAR_UNSIGNED? Может же быть такое, что где-нибудь в настройках среды определят _CHAR_UNSIGNED разработчики среды? Ведь от этого зависит, будет ли преобразовываться "char" к "unsigned char" или к "signed char".
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



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

«ошибка» имелось в виду на стадии компиляции. максимум, что компилятор может на такое сказать — это предупреждение.

у некоторых компиляторов есть настройка «always interpret char as unsigned char».
Записан

Изучением 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
Гость
« Ответ #20 : Март 14, 2014, 20:32 »

у некоторых компиляторов есть настройка «always interpret char as unsigned char».

Я так понимаю, что есть три способа настройки компилятора:
1) Передать через командную строку это настройку при запуске компилятора
2) Через среду программирования (которая сама в конечном итоге запускает компилятор в режиме командной строки и передаёт эту настройку
3) С помощью препроцессора определить: #define _CHAR_UNSIGNED

Так ли я всё понял?
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



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

1 и 2 — да, 3 — не уверен, что это хороший способ. компилятор как раз сам этот дефайн и задаст если нужно сразу для всего проекта.
Записан

Изучением 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
Гость
« Ответ #22 : Март 14, 2014, 21:49 »

Большое спасибо! Улыбающийся
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #23 : Март 15, 2014, 13:04 »

Неявное преобразование из quint64 в qint64 - безопасно, так как не происходит усечения значения.
Никакого "преобразования" здесь не происходит, т.е. физически это не выливается ни в какой код. В рамках данного типа (или если он "старший") арифметике все равно signed/unsigned, напр
Код
C++ (Qt)
quint64 a = -1;
qint64 b = (a - 1) * 5;  // b = -10
 
Однако если данный тип приводится к старшему - тогда "ой"
Код
C++ (Qt)
char a = -1;
unsigned char b = -1;
int a1 = 1 - a; // a1 = -2
int b1 = 1 - b; // b1 = -254
 
Впрочем резвым любителям СУБД это вряд ли нужно - пусть все unsigned, и все дела!
Записан
Страниц: 1 [2]   Вверх
  Печать  
 
Перейти в:  


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