Элементы uint8_t превышают один байт?

Я видел этот код:

uint8_t broadcastAddress[] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};

Я знаю, что uint8_t содержит байт, так как же эта строка кода работает, когда один элемент 0xFF сам по себе представляет собой один целый байт, поэтому ширина массива составляет 6 байт.
Может ли кто-нибудь объяснить, почему 6 байтов данных имеют однобайтовый тип?

Чтобы попробовать это проверить, я написал этот код на Arduino Uno R3:

void setup() {
    Serial.begin(115200);
    // #include <stdint.h>  // Not needed in Arduino IDE with Arduino board selected.
    // #include <stdio.h>  // Not needed in Arduino IDE with Arduino board selected.
}

void loop() {
    delay(3000);
    uint8_t numbers[] = {0xFF, 0x22, 0xA0, 0x3B, 0xC2};  // 5 elements & 5 bytes

    Serial.print("sizeof(numbers) ");
    Serial.println(sizeof(numbers));   // outputs = 5, (obviously the # elements in array)

    for (int i = 0; i <= 8; i++) {
        Serial.print("sizeof(numbers[");
        Serial.print(i);
        Serial.print("]: ");
        Serial.println(sizeof(numbers[i]));  // outputs 1 for i=0 to 8! Element value vanished! non-used elements positions equate to same as used element positions 
    }
}

В комментарии написано, что numbers[] — это 5 элементов. Компилятор подсчитает значения и заполнит правильное число внутри [], превратив его в массив.

BoP 20.07.2024 10:30
uint8_t тип — 1 байт. Размер массива uint8_t равен 1 * количество элементов. sizeof(numbers) — размер массива. И, кстати, можно написать sizeof numbers. Круглые скобки необходимы только для sizeof типа данных, например. sizeof (int) но sizeof my_variable.
i486 20.07.2024 11:31

Если вы выполните Serial.println(sizeof(numbers)) он напечатает 5.

Streve Ford 20.07.2024 12:57
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
3
89
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

увидел этот код: uint8_t BroadcastAddress[] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};

Я знаю, что uint8_t содержит байт, так как же эта строка кода работает, когда один элемент 0xFF сам по себе представляет собой один целый байт, а массив следовательно, ширина 6 байт.

broadcastAddress — это не uint8_t, а скорее массив из uint8_t ([] делает его массивом).
Поэтому он может содержать несколько элементов типа uint8_t.
. Компилятор определит фактический размер массива на основе инициализатора ({0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}) — т. е. в данном случае 6.

То же самое относится и к numbers в вашем тестовом коде (с 5 элементами).

Для sizeof не имеет особого значения, к какому «значению» вы его примените. Имеет значение только тип.

Когда у тебя есть

uint8_t foo[5];

каждый элемент foo имеет тип uint8_t и это все, что заботит sizeof. Он даже не учитывает, какой именно элемент вы используете: это просто элемент foo

sizeof foo[-1]      // all
sizeof foo[1000]    // good

Точно так же, когда делятся два целых числа, полученное значение имеет тип int.

sizeof (1000/3)
sizeof (42/0)   // ok, sizeof just sees an int resulting from dividing 2 ints

Другие вопросы по теме

Общий метод С# определяет, является ли T массивом, а затем индексирует его в массиве
Типы TypeScript — доступ к аргументам функции Тип кортежа из вызова функции (тип Fn, сгенерированный другим типом)
Может ли интерфейс Go получать какую-либо функцию независимо от его сигнатуры?
Обработка динамических выходных данных в функциях Swift без ущерба для безопасности типов (любая)
Использование протокола как типа должно быть записано с любыми (целями обучения)
Какой смысл имеет оператор стрелки в Haskell в функциях, принимающих более одного параметра?
Как исправить столбец с числовыми значениями, который воспринимается как строковое поле из-за пустых строк в фрейме данных Pandas?
Как создать собственный тип для анализа [u8;32] из json, содержащего шестнадцатеричную строку, в Rust
Ограничить тип возвращаемого значения подтипом этого
Компиляция карты времени имени строки типа в типы в C++