Изменение старшего байта 4 байтного числа

А почему не хотите напрямую к нужному байту по указателю обращаться?

Тогда логично (и переносимо) использовать массив из 4 байт.

union

union TOwnValue {
public:
	uint32_t AsLong;
	uint8_t  AsBytes[4];
};

union так же зависит от LE BE …

Пруф
#define printVar(x) do { Serial.print(#x);  Serial.print('='); Serial.print(x, HEX); Serial.println(';'); } while (false)
#define printVarADDR(x) do { Serial.print("ADDR("); Serial.print(#x);  Serial.print(")="); Serial.print((uint32_t)&x, HEX); Serial.println(';'); } while (false)
#define printVarSize(x) do { Serial.print("sizeof("); Serial.print(#x);  Serial.print(")="); Serial.print(sizeof(x)); Serial.println(';'); } while (false)

union TOwnValue {
public:
	uint32_t AsLong;
	uint8_t  AsBytes[4];
};

TOwnValue t;

void setup () {
  Serial.begin(9600);
  Serial.println("Start");
  t.AsLong=0x11223344;
}

void loop() {
  printVar(t.AsLong);
  printVarADDR(t.AsLong);
  printVarSize(t.AsLong);
  printVar(t.AsBytes[0]);
  printVarADDR(t.AsBytes[0]);
  printVarSize(t.AsBytes[0]);
  printVar(t.AsBytes[1]);
  printVarADDR(t.AsBytes[1]);
  printVarSize(t.AsBytes[1]);
  printVar(t.AsBytes[2]);
  printVarADDR(t.AsBytes[2]);
  printVarSize(t.AsBytes[2]);
  printVar(t.AsBytes[3]);
  printVarADDR(t.AsBytes[3]);
  printVarSize(t.AsBytes[3]);
  while (1);
}

Start
t.AsLong=11223344;
ADDR(t.AsLong)=174;
sizeof(t.AsLong)=4;
t.AsBytes[0]=44;
ADDR(t.AsBytes[0])=174;
sizeof(t.AsBytes[0])=1;
t.AsBytes[1]=33;
ADDR(t.AsBytes[1])=175;
sizeof(t.AsBytes[1])=1;
t.AsBytes[2]=22;
ADDR(t.AsBytes[2])=176;
sizeof(t.AsBytes[2])=1;
t.AsBytes[3]=11;
ADDR(t.AsBytes[3])=177;
sizeof(t.AsBytes[3])=1;

Хорошо, какой контроллер, из тех, что на слуху, использует BE?
Не думаю, что ТС када-нить с таким столкнёцца

Микросин пишет что AVR32 на BE - Порядок следования байт (endianness) | dsp | programming
Лично не проверял …

Я вообще не понимаю идею переносимости кода на микропроцессорах ! Не Windows и не Linux же пишем мультиплатформенный. Скорость и компактность кода на выходе - основной принцип для МК

Я еще помню дистрибутив Windows на 4-6 дискетах, что так кардинально изменилось что теперь это 4+ Гб ? Это ~1000 раз на секундочку !!!

1 лайк

Когда (и если) ТС дорастёт до него, он уже будет понимать, какую херню нагородил сейчас. В данный момент, для его говнокода union будет самым правильным решением.

1 лайк

там внутри весь хлам с 1995г для “совместимости”
ЗЫ Хотя, памойму они 16-битную подсистему(от 3.11) в Win7 почикали.

10 ка на P4 вроде не работает, какая нах совместимость с 1995 (это 86 286 386) …

Всё, что есть в ХР, есть в 11.

Это совместимость по железу, а я про программную. :slight_smile:

Да, как бы винду не хаяли, а совместимость она тащит за собой с незапамятных времен. В отличии от других ОС.

Это каких? Linux? QNX?
PS А по винде, хотел бы я посмотреть на приложение на Винде на котором два человека смогут набрать и изготовить 15 тысяч проездных билетов к примеру (с персональными данными и фото) за один месяц, с наклейкой фото и ламинацией естественно

Нет.
Если к представлению в виде “uint32_t” НЕ обращатьбся побайтно, а только целиком, то у нас есть ДВЕ сущности - 4 отдельных байта и четырёхбайтовый объект. При хранении и пересылке - объект целиком, язык гарантирует его цельность. При работе - 4 отдельных байта, в каком порядке юнион их пакует в объект - программиста НИКАК НЕ ВОЛНУЕТ.

1 лайк

Старший байт в какой ячейке массива окажется при LE и при BE. У ТС конкретный вопрос был …

Пока пытаюсь сохранять спокойствие…
Ответ на вопрос: “В какой ячейке находится байт”: Не имеет значения, если ты будешь обращаться к нему ТОЛЬКО через юнион.
Еще раз, для доходчивости - НЕ ИМЕЕТ ЗНАЧЕНИЯ.

Я понимаю что вы про несвязанные данные пишите. У ТС другая задача была.

И я и коллеги-профессионалы, про то и пытались сказать, советуя ТС не забивать себе мозг.
ПРО ТО, что нужно изменять постановку задачи! Очень трудно придумать задачу в которой реально необходимо то, о чем спрашивал ТС.

ЗЫ: Не ОФФТОП, но немного в сторону.
Наш ТС - Роман, как человек жадно изучающий новую тему, часто задается абстрактными задачами. :wink: Его пытаются вернуть к реальности. Это особенность самообучения, без наставника. Данная тема - характерный пример. При правильной работе с полями задача не имеет смысла.

1 лайк

по мне так главное что парень врубается САМ!, а то что задача бессмысленна, тоже врубится, но позже))

2 лайка

Ну во первых я даже не подумал , что так можно…потом уже подсказали, а во вторых разбирался как работают битовые операции … :slightly_smiling_face: ну и как правильно здесь указали , по указателю будет зависить от формата числа… В моем случае конечно не имеет значения , т.к порядок байт формирую я сам… . Но с этим вариантом вконце тоже разбирался…