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

Скажи пожалуйста где я туплю…

void setup() {
Serial.begin(19200);
uint32_t t=0xCCCCCCCC;
t = (t & 0x00ffffff) |  (0xaa<<24);
Serial.println(t,HEX);
}

void loop() {
  // put your main code here, to run repeatedly:

}

Надо так

 void setup() {
Serial.begin(19200);
uint32_t t=0xCCCCCCCC;
uint32_t g = 0xaa;
t = (t & 0x00ffffff) |  (g<<24);
Serial.println(t,HEX);
}

void loop() {
  // put your main code here, to run repeatedly:

}

Так как 0xaa улетает влево, и остаётся 0х00

2 лайка

а если просто взять и положить в старший байт по адресу переменной? Не?

Вы ступили, когда поленились объяснить, что Вы хотели сделать. Народ догадывается сам и что-то Вам пишет в силу своих догадок.

1 лайк

???
а что не так?

Маски сдвиги … что так сложно то ???
Будьте проще и делайте СРАЗУ ТО ЧТО В ЗАДАЧЕ УКАЗАНО !

uint32_t t = 0xCCDDEEFF;

void setup () {
   Serial.begin(9600);
   Serial.println("Start");
   Serial.println(t, HEX);
   *((byte*)&t+3)=0xBB;
   Serial.println(t, HEX);
}

void loop() {
}
2 лайка

За 7 строчку данке шён!!!
Кстати, один в один как я бы сделал в кодах на процессоре Интел!
Я жеж говорю, компиляторы достигли совершенства…

*((byte*)&t+3)=0xBB;
 144:	8b eb       	ldi	r24, 0xBB	; 187
 146:	80 93 03 01 	sts	0x0103, r24	; 0x800103 <__DATA_REGION_ORIGIN__+0x3>

Достигли ? Всегда так было ±. В паскале директива Absolute была с “каменного века”. В си просто синтаксис не сразу заходит для такого случая …

Офигеть проще! (Это Командиру.) Попробуй так:
t = (t & 0x00ffffff) | ((uint32_t)0xaa<<24);

1 лайк

ua6em
Если не сложно - выложите для Green листинг его варианта …

Надеюсь он не приедет мне морду бить )))

  t = (t & 0x00ffffff) | ((uint32_t)0xaa<<24);
 144:	40 91 00 01 	lds	r20, 0x0100	; 0x800100 <__DATA_REGION_ORIGIN__>
 148:	50 91 01 01 	lds	r21, 0x0101	; 0x800101 <__DATA_REGION_ORIGIN__+0x1>
 14c:	60 91 02 01 	lds	r22, 0x0102	; 0x800102 <__DATA_REGION_ORIGIN__+0x2>
 150:	70 91 03 01 	lds	r23, 0x0103	; 0x800103 <__DATA_REGION_ORIGIN__+0x3>
 154:	77 27       	eor	r23, r23
 156:	7a 6a       	ori	r23, 0xAA	; 170
 158:	40 93 00 01 	sts	0x0100, r20	; 0x800100 <__DATA_REGION_ORIGIN__>
 15c:	50 93 01 01 	sts	0x0101, r21	; 0x800101 <__DATA_REGION_ORIGIN__+0x1>
 160:	60 93 02 01 	sts	0x0102, r22	; 0x800102 <__DATA_REGION_ORIGIN__+0x2>
 164:	70 93 03 01 	sts	0x0103, r23	; 0x800103 <__DATA_REGION_ORIGIN__+0x3>

ЗЫ и таки да, менять аж 4 байта вместо одного это СОВРЕМЕННО )))

6-36 результат как говорится налицо …

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

Командир, ты какой то странный, не находишь?
Сам же сказал проще. Не быстрее, не с красивым асм-листингом! Оказывается, начинающему “проще” с указателями, с размещением переменной в памяти, со знанием таких понятий как big endian / little endian… Про наглядность я уже не говорю.

а что там в коде Командира сверхнепонятного?

  1. &t+3 (разыменование вроде) а по простому - взять адрес переменной и добавить к адресу +3 получим адрес (четвёртого) - старшего байта
    2.* (byte*)адрес ) = OхBB поместить по указанному адресу байт 0xBB

уж проще наверное невозможно

для восприятия такими как я не профи сложнее, но сильно красивее

код понятный, но переносимость его нулевая. Биг ендиан - литле ендиан не учитывается. Не зря подобные выражения в Мисра запрещены.
Код Грина в разы правильнее с точки зрения стандарта.

3 лайка

по мне это должен делать компилятор (вычислять правильный адрес и им оперировать)

b707
Для этого есть условная компиляция.

Если вы с командиром явно указываете смещение адреса - компилятор не сможет исправить ваши ошибки