На моей машине следующая программа записывает 1234 в свой вывод.
const char str[] = "1234";
printf("%c%c%c%c\n",
(int) (0xff & (*(uint32_t*) str) >> 0),
(int) (0xff & (*(uint32_t*) str) >> 8),
(int) (0xff & (*(uint32_t*) str) >> 16),
(int) (0xff & (*(uint32_t*) str) >> 24));
Это подразумевает, что str
внутренне представлен как 0x34333231
и первый байт str[0]
представляет наименее значимые 8 бит.
Это значит str
закодирован в порядке байтов? И зависит ли выход этой программы от платформы?
Кроме того, есть ли удобный способ использовать строковые литералы из 1, 2, 4 и 8 символов в операторах переключения регистра? Я не могу найти способ преобразовать строки в целые числа, так как *(const uint32_t* const) "1234"
не является постоянным выражением, и 0x34333231
/0x31323334
может зависеть от платформы и должен быть записан в шестнадцатеричном формате.
редактировать:
Другими словами, это 0xff & *(uint32_t*) str
всегда равно str[0]
?
Эх, неважно, просто понял, что это так и почему.
Порядковый номер относится к порядку байтов в большем значении. Строки (по крайней мере, в C и C ++) — это массив байтов, поэтому порядок байтов не применяется.
На самом деле вы можете делать то, что упоминаете в последнем абзаце, используя литералы из нескольких символов, хотя его реализация определяет, как именно он работает, и длина строки не должна превышать sizeof(int)
,
Стандарт C ++, §2.14.3 / 1 — Символьные литералы
(…) Обычный символьный литерал, содержащий более одного символа c-char, является литералом с несколькими символами. Литерал с несколькими символами имеет тип int и значение, определяемое реализацией.
Например, 'abcd'
это значение типа int
с определенным значением реализации. Это значение, вероятно, будет зависеть от порядка байтов. Поскольку это целое число, вы можете включить его.
Вы путаете порядковый номер строки (которая не существует, пока мы говорим о строках ASCII) с порядковым номером целого числа. Целое число в вашей системе является прямым порядком байтов.
Чтобы ответить на ваш второй вопрос, нет, вы не можете включить строки. Если вы действительно отчаянно нуждаетесь в увеличении скорости, вы можете выбрать один для систем с прямым порядком байтов и один для систем с прямым порядком байтов.
Байты размещаются по мере увеличения адресов памяти как 0x31, 0x32, 0x33, 0x34.
В 32-разрядном целом числе is little endian у вас есть 0x34333231. Если большой порядок байтов 0x31323334.
(Также в целом целые числа выровнены по четным или четырехкратным адресам.)