Скажи пожалуйста где я туплю…
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;
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
а если просто взять и положить в старший байт по адресу переменной? Не?
Вы ступили, когда поленились объяснить, что Вы хотели сделать. Народ догадывается сам и что-то Вам пишет в силу своих догадок.
Маски сдвиги … что так сложно то ???
Будьте проще и делайте СРАЗУ ТО ЧТО В ЗАДАЧЕ УКАЗАНО !
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() {
}
За 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);
Надеюсь он не приедет мне морду бить )))
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… Про наглядность я уже не говорю.
а что там в коде Командира сверхнепонятного?
уж проще наверное невозможно
для восприятия такими как я не профи сложнее, но сильно красивее
код понятный, но переносимость его нулевая. Биг ендиан - литле ендиан не учитывается. Не зря подобные выражения в Мисра запрещены.
Код Грина в разы правильнее с точки зрения стандарта.
по мне это должен делать компилятор (вычислять правильный адрес и им оперировать)
Если вы с командиром явно указываете смещение адреса - компилятор не сможет исправить ваши ошибки