Понадобилась банальнейшая вещь — преобразовать значение из строки...
Имею строку в которой хранится шестнадцатеричное представление HRESULT.
Ну и нужно получить само значение HRESULT.
Естественно, воспользовался RTL'ной ф-цией. А так как HRESULT есть long'ом, то в качестве ф-ции и выбрал strtol.
Была написана следующая обёрточка:
Здравствуйте, Аноним, Вы писали:
А>Вопрос знатокам. Почему для получения signed long значения нужно пользоваться ф-цией возвращающей unsigned long?
А зачем ты представил signed long в виде unsigned long в строке? Пиши ее как -0x7FF8FFA9 и будет работать _tcstol.
Здравствуйте, Were, Вы писали:
W>А зачем ты представил signed long в виде unsigned long в строке? Пиши ее как -0x7FF8FFA9 и будет работать _tcstol.
как же, представил... Мне пришла такая строка — без унарного минуса! И я знаю только, что это тип HRESULT, т.е. просто signed long.
а даже если бы я сам представил, то почему HEX'овая строка 0x80070057 это unsigned? Я, например, вижу крайнем бите единицу, т.е. отрицательное значение.
Интересная ситуация выходит.
При конвертации signed в hex строку
TCHAR sz[9];
_ltot(E_INVALIDARG, sz, 16);
получу верное значение "80070057" (а не "-0x7FF8FFA9")
а при обратном — hex в signed
Здравствуйте, chpunteg, Вы писали:
C>Здравствуйте, Were, Вы писали:
W>>А зачем ты представил signed long в виде unsigned long в строке? Пиши ее как -0x7FF8FFA9 и будет работать _tcstol. C>как же, представил... Мне пришла такая строка — без унарного минуса! И я знаю только, что это тип HRESULT, т.е. просто signed long.
C>а даже если бы я сам представил, то почему HEX'овая строка 0x80070057 это unsigned? Я, например, вижу крайнем бите единицу, т.е. отрицательное значение.
А функция считает, что это положительное значение, которое не влезает в signed long. Формат входной строки описан в документации к функции кстати, и знак минуса там нужно указывать явно.
C>не логично как-то...
А кто сказал, что функция _ltot обратная для _tcstol? В документации к _ltot сказано, что знак минус ставится только для десятичной базы, а в _tcstol он должен быть указан явно для всех.
В общем используй _tcstoul и преобразуй unsigned в signed.
Здравствуйте, Were, Вы писали:
W>А функция считает, что это положительное значение, которое не влезает в signed long. Формат входной строки описан в документации к функции кстати, и знак минуса там нужно указывать явно. W> кто сказал, что функция _ltot обратная для _tcstol? В документации к _ltot сказано, что знак минус ставится только для десятичной базы, а в _tcstol он должен быть указан явно для всех.
да, уже увидел... спасибо.
W>В общем используй _tcstoul и преобразуй unsigned в signed.
в первом посте так сделал...
ЗЫЖ
Нет, я понимаю почему она так конвертит. Сразу понял.
Но до сих пор был уверен, что RTL'ные ф-ции конвертации взаимообратны:
atoi <-> itoa
_ltot <-> _tcstol
_ultot <-> _tcstoul
_i64tot <-> _tcstoi64
...
а оказалось — не всегда
Было удивлен, получив на вызов checkLongStrLong(E_INVALIDARG) значение false