Порядковый номер строковых литералов и использование строк в операторах case

На моей машине следующая программа записывает 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]?

Эх, неважно, просто понял, что это так и почему.

0

Решение

Порядковый номер относится к порядку байтов в большем значении. Строки (по крайней мере, в C и C ++) — это массив байтов, поэтому порядок байтов не применяется.

На самом деле вы можете делать то, что упоминаете в последнем абзаце, используя литералы из нескольких символов, хотя его реализация определяет, как именно он работает, и длина строки не должна превышать sizeof(int),

Стандарт C ++, §2.14.3 / 1 — Символьные литералы

(…) Обычный символьный литерал, содержащий более одного символа c-char, является литералом с несколькими символами. Литерал с несколькими символами имеет тип int и значение, определяемое реализацией.

Например, 'abcd' это значение типа int с определенным значением реализации. Это значение, вероятно, будет зависеть от порядка байтов. Поскольку это целое число, вы можете включить его.

2

Другие решения

Вы путаете порядковый номер строки (которая не существует, пока мы говорим о строках ASCII) с порядковым номером целого числа. Целое число в вашей системе является прямым порядком байтов.

Чтобы ответить на ваш второй вопрос, нет, вы не можете включить строки. Если вы действительно отчаянно нуждаетесь в увеличении скорости, вы можете выбрать один для систем с прямым порядком байтов и один для систем с прямым порядком байтов.

4

Байты размещаются по мере увеличения адресов памяти как 0x31, 0x32, 0x33, 0x34.

В 32-разрядном целом числе is little endian у вас есть 0x34333231. Если большой порядок байтов 0x31323334.

(Также в целом целые числа выровнены по четным или четырехкратным адресам.)

0
По вопросам рекламы [email protected]