Библиотека Wire Arduino, приведение типов

У меня возникли проблемы с пониманием этой строки кода, которую я вижу в каждом руководстве по Arduino EEPROM.

int saveLocation = 4095;
Wire.write((int)(saveLocation >> 8));

Вопрос 1: Указывают ли круглые скобки на то, что сдвиг битов происходит ДО приведения типа? Каков порядок операций?

Согласно документации библиотеки wire, вы можете использовать wire для отправки следующего:

Wire.write(value) // значение для отправки в виде одного байта
Wire.write(String) // строка для отправки в виде последовательности байтов
Wire.write(data, length) // массив данных для отправки в виде байтов, количество байтов для передачи.

Итак, моя переменная int saveLocation = 4095 не является строкой или массивом, поэтому она должна рассматриваться как "значение", что означает, что она отправляется как 1 байт.

Вопрос 2: Если он отправляется как 1 байт, зачем мне приводить его к целому числу в 2 байта?
Вопрос 3: Если saveLocation уже является целым числом, зачем приводить его к int?
Вопрос 4: Поскольку int равен двум байтам, выполняется ли проводка.записать только отправку младшего байта?

Заранее спасибо за помощь.

, 👍1

Обсуждение

вам не хватает 1/2 кода адресации EEPROM, @jsotola


2 ответа


Лучший ответ:

2

Вы правы насчет того, что вы в замешательстве. Этот кастинг не имеет никакого смысла.

Вопрос 1: Указывают ли круглые скобки на то, что сдвиг битов происходит ДО приведения типа? Каков порядок операций?

Да, сдвиг битов происходит перед приведением из-за круглых скобок.

Вопрос 2: Если он отправляется как 1 байт, зачем мне приводить его к целому числу в 2 байта?

Ты бы этого не сделал. Он в любом случае преобразуется в uint8_t (он же байт) по типу параметра.

Вопрос 3: Если saveLocation уже является целым числом, зачем приводить его к int?

Для меня это тоже не имеет смысла. Тебе это и не нужно. Хотя здесь это тоже не повредит (то же самое относится и к вопросу 2)

Вопрос 4: Поскольку int равен двум байтам, выполняется ли проводка.записать только отправку младшего байта?

Да, только младший байт. Параметр функции имеет тип uint8_t, который равен ровно одному байту. Вот в чем причина смещения бита. Сдвигая значение вправо на 8, вы эффективно сдвигаете старший байт в младшую байтовую позицию.

,

Чувак, я думал, что я сошел с ума! Но чего я не понимаю, так это того, что если вы ищете в Интернете код для обращения к чипам EEPROM, все они используют эту строку для отправки данных. Я подумал, что наверняка мне чего-то не хватает, потому что В КАЖДОМ учебнике есть одна и та же глупая строка кода. Спасибо вам за то, что помогли мне разобраться в этом!, @HavocRC

Часто, когда пример кода написан, он копируется снова и снова по всему Интернету., @chrisl


1

Вопрос 1: Указывают ли круглые скобки на то, что сдвиг битов происходит ДО приведения типа? Каков порядок операций?

ДА. То, что находится в скобках, вычисляется, а затем результат преобразуется в int.

Вопрос 2: Если он отправляется как 1 байт, зачем мне приводить его к целому числу в 2 байта?

Ты бы этого не сделал.

Вопрос 3: Если saveLocation уже является целым числом, зачем приводить его к int?

Ты бы этого не сделал

Вопрос 4: Поскольку int равен двум байтам, выполняется ли проводка.записать только отправку младшего байта?

Да, только самые младшие 8 бит.

Приведение к целому числу здесь полностью избыточно. Он не выполняет ничего, кроме усложнения понимания кода. Вы можете удалить его, и это не будет иметь никакого значения.

На самом деле наличие приведения int запускает перегруженную функцию:

inline size_t write(int n) { return write((uint8_t)n); }

Так что он все равно просто преобразует его в 8-битное целое число (байт) без знака.

,

Спасибо и тебе, Маенко. Я не понимаю, почему весь онлайн-код для микросхем EEPROM использует эту строку кода, это не может не сбивать с толку., @HavocRC