@daniil14056

Что за формат чисел в ассемблерных файлах 000ABC100h в конце 'h', конкретно как парсить?

Понятно что 16ый. на всяк случай.
Где узнать полностью про формат. Интересует, каким должен быть первый символ.
Обычно числа такие 07fffff000h, иногда 1ff000000h такие,
Конкретный вопрос А могул ли быть, А100000000000000h, то есть начаться с А? Или тогда "0" будет в начале.

Есть ли методы или классы парсинга неизвестного формата числа из потока текстового? (Наверняка есть)

Есть ли в c# универсальный парсер всех возможных чисел. А то уже несколько раз велосипед пилил.
Для чисел
  1. double 0.121221
  2. int 0xaa (почему кстати c# не парсит такие числа, нужно там заморачиватся сдвигая на 2)
  3. int 00aah
  4. int aa
  5. int 10
  6. int 10u (со всякими знаками после числа)
  7. int 0и010101100100100101010


Допустим что-то вроде такого должна возвращать. Есть ли такая функция или библиотека.
Token magic_func(Stream s);  // обычно строк 200-400 машина состояний, реализовывал для всех форматов, но грязно.
DoubleToken:Token{
 double Numb;
}
IntegerToken:Token{
 int Numb;
}
  • Вопрос задан
  • 90 просмотров
Решения вопроса 1
mayton2019
@mayton2019
Bigdata Engineer
Давай слегка тормознем твой поток созднания. Слишком много у тебя тезисов.
В каждом языке программирования есть свои числовые литералы. В си-шарпе - свои.
И в ассемблере свои.

Попробуем ответить на первый.

А могул ли быть, А100000000000000h, то есть начаться с А


Да могут быть. В хекс-системе числа состоят из цифр и букв от A до F. Другое
дело что ты должен следить за разрядностью и понимать что в регистр процессора
(ассемблер) и тип данных (для шарпов) может влезать ограниченный диапазон
величин. Например для ассемблерного двойного слова (DWORD) максимальное число FFFFFFFFh
И для шарпового unsigned long максимальное 0xFFFF_FFFF_FFFF_FFFF

Тоесть правильный ответ состоит из проверки числа на допустимые символы и проверки
ТИПА данных на диапазон.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
saboteur_kiev
@saboteur_kiev
software engineer
Ты немного путаешь формат записи и разрядность архитектуры.

1. Чтобы отличать числа от меток и переменных, считается что любая запись числа должна начинаться с цифры, поэтому часто шестнадцатиричные записи могут быть записаны с дополнительным ведущим 0
( 0a10h ), именно чтобы в начале не было а.

2.
Для шестнадцатиричной записи используется суффикс h
0293h, 0a123123h
Также для шестнадцатиричной можно использовать формат 0x<ЧИСЛО>
0xab, 0x01, 0xFF23

Использовать и префикс и суффикс типа 0xA019h - не стандарт, и я навскидку не могу вспомнить где такое может быть, и скорее всего так будет неправильно. Но может быть где-нибудь какой-нибудь парсер предусмотрел и такую глупость, поэтому кушает без выдачи ошибок.

3. Для двоичной записи используется суффикс b
000101010b, 1b

4. Для восьмиричной используется суффикс q
1q, 2323q, 7283123q

5. Для обычной десятичной можно указывать суффикс d, или не указывать его
123, 123d, 982d, 1
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы