Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Получить int из char
|
|||
|---|---|---|---|
|
#18+
Здравствуйте. Пишу программу в Visual Studio 2008. Проект Win32. Подскажите, имеется Код: plaintext 1. Как получить Код: plaintext 1. из значений Код: plaintext 1. и Код: plaintext 1. . В данном случае i должно быть равно 163. Я сделал так: Код: plaintext 1. Мне кажется, что это примитивно. Может есть другие варианты? Потому что long long int таким методом не удобно получать. Цикл наверное тоже не красиво будет смотреться. Спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.01.2015, 12:16 |
|
||
|
Получить int из char
|
|||
|---|---|---|---|
|
#18+
DrumAsmМне кажется, что это примитивно Ну замени умножение на сдвиг для "продвинутости". Это решение, в отличии от каста, не зависит от процессора. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.01.2015, 12:37 |
|
||
|
Получить int из char
|
|||
|---|---|---|---|
|
#18+
DrumAsmВ данном случае i должно быть равно 163. Я сделал так: i=p[2]*256+p[1]; Так у тебя будет 0xA300 163 будет так p[1]*256+p[2] Если все-таки правильно считать так как ты написал, то можно так Код: plaintext 1. Если правильно как я написал, то *256 но делать это в цикле Код: plaintext 1. 2. 3. 4. 5. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.01.2015, 13:06 |
|
||
|
Получить int из char
|
|||
|---|---|---|---|
|
#18+
Dima T, Точно! 0xA300. Sorry. Это я уже запарился.. А в первом случае просто переносится указатель? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.01.2015, 13:23 |
|
||
|
Получить int из char
|
|||
|---|---|---|---|
|
#18+
DrumAsmDima T, Точно! 0xA300. Sorry. Это я уже запарился.. А в первом случае просто переносится указатель? Нет, читается значение, но читается как тип unsigned short. А т.к. unsigned short это два байта, то кроме p[1] берется p[2]. ХЗ как еще объяснить. если пошагово расписать то вот что происходит: Код: plaintext 1. 2. 3. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.01.2015, 13:33 |
|
||
|
Получить int из char
|
|||
|---|---|---|---|
|
#18+
Это решение чувствительно к архитектуре процессора — на одних архитектурах результат будет 0xA300, на других 0x00A3, на третьих результат не определён, на четвёртых программа упадёт. Лучше уж сдвигами. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.01.2015, 13:41 |
|
||
|
Получить int из char
|
|||
|---|---|---|---|
|
#18+
Dima T, А вот всегда интересовал такой вопрос. Можно указателю unsigned short i присвоить адрес p[1], чтобы из указателя i я мог получить p[1] и p[2]? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.01.2015, 13:42 |
|
||
|
Получить int из char
|
|||
|---|---|---|---|
|
#18+
DrumAsm, в том то и весь цимес брат. Можно. Это похоже на езду без ремней безопасности. Быстро и опасно. Но можно. На сях. В отличие от этих ваших шарпов и джав. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.01.2015, 13:59 |
|
||
|
Получить int из char
|
|||
|---|---|---|---|
|
#18+
DrumAsmDima T, А вот всегда интересовал такой вопрос. Можно указателю unsigned short i присвоить адрес p[1], чтобы из указателя i я мог получить p[1] и p[2]? брр ... ты сам понял что написал? Сделать из указателя char указатель short чтобы потом из него извлекать char. Можно, но зачем? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.01.2015, 14:04 |
|
||
|
Получить int из char
|
|||
|---|---|---|---|
|
#18+
RWolfЭто решение чувствительно к архитектуре процессора — на одних архитектурах результат будет 0xA300, на других 0x00A3, на третьих результат не определён, на четвёртых программа упадёт. Лучше уж сдвигами. Вроде уже не осталось архитектур где будет 0x00A3 (т.н. big endian), а "результат не определён" вообще из области фантастики. Недавно пробовал откомпилировать одну свою программулину с подобными конструкциями под ARM-процессор - запустилось, работало корректно, общалась по сетке с другой прогой под виндой. Возможно есть какая-то экзотическая электроника с big endian, но если ТС до нее доберется, то, думаю, проблема big endian будет не самой серьезной. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.01.2015, 14:27 |
|
||
|
Получить int из char
|
|||
|---|---|---|---|
|
#18+
Dima T, извлекать не char, а short int. Он же из себя и будет представлять p[2]*256+p[1] ? Или я ошибаюсь? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.01.2015, 14:29 |
|
||
|
Получить int из char
|
|||
|---|---|---|---|
|
#18+
Dima T, не определён — это ARM ниже v7. В зависимости от ядра невыровненный доступ к данным может как менять порядок чтения байт, так и прерывать выполнение. Выровненный доступ при этом будет работать нормально. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.01.2015, 14:42 |
|
||
|
Получить int из char
|
|||
|---|---|---|---|
|
#18+
DrumAsmDima T, извлекать не char, а short int. Он же из себя и будет представлять p[2]*256+p[1] ? Или я ошибаюсь? Все верно. Я же тебе выше подробно расписал что происходит. Если надо указатель на short то сокращенно так: Код: plaintext 1. суть такая: ты даешь указание компилятору рассматривать последовательность байт не как массив, а как значение другого типа (размером больше байта), т.е. например в памяти лежит массив байт Адрес значение123400x20123410x00123420xA3123430x45123440x89 Если этот кусок памяти рассматривать как массив char то для получения значения p[1] будет взято значение байта по адресу 12341, т.е. 0x00 Если посчитать что по адресу 12341 лежит значение типа short, то будут взяты два байта 0x00 и 0xA3 и т.к. принят порядок хранения от младшего к старшему, то процессор посчитает это числом 0xA300 Если захочешь прочитать как тип int (4 байта) то получится 0x8945A300. Подробнее тут ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.01.2015, 14:43 |
|
||
|
Получить int из char
|
|||
|---|---|---|---|
|
#18+
Dima T, спасибо, получилось)) А если вот так? short * i = reinterpret_cast<short*>(&p[1]); Читал, что не желательно это использовать, но всё же.. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.01.2015, 15:19 |
|
||
|
Получить int из char
|
|||
|---|---|---|---|
|
#18+
DrumAsmА если вот так? short * i = reinterpret_cast<short*>(&p[1]); не знаю что такое reinterpret_cast, это из С++, я с ним слабо дружу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.01.2015, 15:24 |
|
||
|
Получить int из char
|
|||
|---|---|---|---|
|
#18+
Кроме порядка байтов следует еще учитывать что не на всех платформах можно читать слова большие байта по невыравненным адресам. Если же не учитывать выравнивание, то считывать big endian можно так: Код: plaintext 1. 2. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.01.2015, 15:33 |
|
||
|
Получить int из char
|
|||
|---|---|---|---|
|
#18+
Всем спасибо за помощь. Всё получилось. Кому тоже интересно, вот варианты: Код: plaintext 1. или Код: plaintext 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.01.2015, 16:30 |
|
||
|
Получить int из char
|
|||
|---|---|---|---|
|
#18+
DrumAsm, а тебе интересно узнать в чем разница между этими вариантами? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.01.2015, 18:09 |
|
||
|
Получить int из char
|
|||
|---|---|---|---|
|
#18+
DrumAsm Как получить Код: plaintext 1. из значений Код: plaintext 1. и Код: plaintext 1. . В данном случае i должно быть равно 163. Я сделал так: Код: plaintext 1. Мне кажется, что это примитивно. На самом деле это -- лучший вариант. Тут нет неопределённого поведения и всё явным образом определено. Можно заменить ещё умножения на сдвиги и сложения на побитовое ИЛИ -- это просто более простые операции. Но в принципе это одно и то же. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.01.2015, 13:19 |
|
||
|
Получить int из char
|
|||
|---|---|---|---|
|
#18+
Арифметически-чистый. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.01.2015, 15:45 |
|
||
|
Получить int из char
|
|||
|---|---|---|---|
|
#18+
Здравствуйте. Anatoly MoskovskyКроме порядка байтов следует еще учитывать что не на всех платформах можно читать слова большие байта по невыравненным адресам. Если же не учитывать выравнивание, то считывать big endian можно так: Код: plaintext 1. 2. Если мы работаем только с artithmetic types, то в каком случаем данная конструкция будет работать некорректно ? Код: plaintext 1. Если &object адрес элемента массива A и &object+sizeof(T) адрес элемента массива A. Объекты массива А имеют тип T1 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.01.2015, 02:27 |
|
||
|
Получить int из char
|
|||
|---|---|---|---|
|
#18+
почему вообще сложилось так, что little-endian и big-endian имеют место быть вместе ? Неужели когда проектировался фундамент, не было конференций и встреч разработчиков ведущих IT компаний, и они не могли согласовать стандарт, которого все должны были придерживаться ? прошу прощение за офтоп. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.01.2015, 02:39 |
|
||
|
Получить int из char
|
|||
|---|---|---|---|
|
#18+
SashaMercuryЕсли мы работаем только с artithmetic types, то в каком случаем данная конструкция будет работать некорректно ? Код: plaintext 1. Я же написал: Anatoly MoskovskyЕсли же не учитывать выравнивание SashaMercuryпочему вообще сложилось так, что little-endian и big-endian имеют место быть вместе ? Неужели когда проектировался фундамент, не было конференций и встреч разработчиков ведущих IT компаний, и они не могли согласовать стандарт, которого все должны были придерживаться ? прошу прощение за офтоп. А также всех пересадить за одну ОС, поселить в одинаковых домах и заставить ездить только на метро ))) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.01.2015, 05:53 |
|
||
|
Получить int из char
|
|||
|---|---|---|---|
|
#18+
SashaMercuryпочему вообще сложилось так, что little-endian и big-endian имеют место быть вместе ? Вообще конечно, все стандарты диктуются экономикой. Изначально большинство применяло big-endian, потому что он ближе к человеческому представлению чисел, а компьютеры при реализации разных фич могли себе позволить занимать любой физический объем. Но когда появились первые микропроцессоры с ограничением на размер оборудования и количество элементов в нем, то для экономии транзисторов стали применять такое размещение данных, которое соответствует алгоритмам обработки. В частности арифметические операции производятся от младших разрядов к старшим. Так и появилось два подхода, потому что существующий big-endian никто естественно не стал отменять - ничего личного, просто бизнес :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.01.2015, 06:12 |
|
||
|
|

start [/forum/topic.php?fid=57&msg=38854222&tid=2019146]: |
0ms |
get settings: |
8ms |
get forum list: |
11ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
55ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
51ms |
get tp. blocked users: |
1ms |
| others: | 11ms |
| total: | 157ms |

| 0 / 0 |
