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

Неправда! Нет в этой книжке такой задачи, как “Изменение старшего байта 4 байтного числа”. А знаете почему нет? Потому, что это говнокод! Вы пытаетесь учиться говнокодить, не научившись программированию.

Я Вам всю эту тему пытаюсь объяснить, что Вы не тому учитесь. Это Вам ничего не даст. Будете ещё одним говнокодером, а то их у нас мало.

2 лайка

пришел начальник и всех причесал …

Я это на протяжении всей темы пытаюсь объяснить, но ТС закусил удила :slight_smile:

Ну а как иначе! Если одна галиматня лучше другой.

Ну хорошо пусть начало темы говнокод … я не спорю потом то я пытался разобраться , что такое стек воочию так сказать без кода … просто как и что работает …

Еще если не сложно … а почему

t = (t & 0x00ffffff) | (0xaa<<24)

считается говно кодом ?

Ну, если пытались, так скажите что это такое простыми словами. Можете?

Не всегда. Если t - битовая маска, то это нормальный код.

А если t - число - то, конечно говнокод. начнём с того, что его работоспособность сильно зависит от используемой архитектуры. Число меняет знак при такой операции, да до хрена чего.

Если Вам нужно выполнить подобную операцию с числом, так и работайте как с числом! Напишите то же самое обычными операциями с числами. Компилятор и без Вас соптимизирует и сделает примерно как сейчас написано, но это будет переносимо и корректно.

Ну как тут скажешь… Это как дамочка увидела порево в ручке, но не смогла объяснить словами что там изображено.)

1 лайк

Вы про что , про то как работает , я ж вроде выше расписал , или про то что такое стек…
Стек область памяти куда заносятся данные по принципу что положил последнее то вытащил первым. используется для хранения временных данных , таких как адреса возврата из функций … у стека есть указатель колторый указывает на свободный адрес в начале стека. адреса по мере заполнения уменьшаюстя… Указатель SP - регистр для данного авр 16 битный… имеет кода 3Dh и 3Eh . Указатель изменяется аппаратно , поэтому чтобы закинуть данные под них высвобождается сперва место заносится новый пустой адрес в SP , а потом нужные данные заносятся в освободившиеся место ( по крайне мере в авр )

конкретно в данном случае 0x00FFFFFF маска используемая с опператором & ,
а вот t я использую не как , число , а как 4 байта обьедененые общим признаком , и мне в моем коде нужно менять не целиком а побайтно , не затрагивая остальные байты… сперва сделал разложмил изменил сложил …но как и написал не камильфо вот и решил со сдвигами т.к это часто используют в си…

Простите, не сразу заметил ещё один важный момент.

Это говнокод уже хотя бы потому, что в нём ОЧЕНЬ легко сделать ошибку. И Вы её сделали! Попробуйте запустить на ардуине UNO

вот такой код.
void setup(void) {
	Serial.begin(9600);
	uint32_t t = 0x12345678;
	Serial.println(t, HEX);
	t = (t & 0x00ffffff) | (0xaa<<24);
	Serial.println(t, HEX);
}
void loop(void) {}

результат Вас слегка удивит.

Не удивит …
Если посмотрите первое сообщение я именно с этим эту тему и пришел … У меня как раз и не получалось изменить старший байт … правда я про инт32 вначале не думал …
В итоге на кидали разных решений и я решил разобраться в них… Ну в последнем немного поконкретнее т.к там указатели а меня пока что интересует все что с ними связано…

А не надо “для данного авр”. Я просто спросил что такое стек. Вы не поверите, но он существовал за десятки лет до авр.

Ну, если это маска, то хрен с Вами, зачем только в заголовке про число писали.

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

А нахрена ж Вы его сейчас в таком виде приводите?

Не в моей , это мне решение написали … хотя в моей тоже … какя и говорил именно с этим пришел…
насчет число в заголовке… ну если бы написал изменить один байт в 4 байтах … меняб вообще заклевали неразобьравшись :smile: :laughing: :rofl:

моя не сильно отличается и также не работает

А нет … в моей прошу прощения…со слепу не разглядел , там где привели мою строку к (unit32_t) работает а моя нет тю.к пылся сдвинуть на 24 в 16 битном

t = (t & 0x00ffffff) | ((uint32_t)0xaa<<24);

садись 4 ?

Роман! Твоя любознательность и необидчивость - реально очень ценные качества! Это не сарказм.
Чтобы понимать то, что имеют ввиду профессионалы нужен практический опыт. Так что пока не забивай себе голову понятием “говнокод”. Считай это просто не очевидным кодом с большими возможностями “наступить на грабли”.
Видя твою заинтересованность в предмете, я бы посоветовал тебе подтянуть теорию именно алгоритмов. В западных учебника есть такое понятие “гуд практис (good practice)” это примеры для подражания при решении типовых задач.

Например в этой теме, если у тебя есть маска в 32 бита, которая логически разделена на байты, то “гуд практис” - оперировать с байтами, а не с 32 битным представлением.

не понял немного…
маску использовал для того , чтоб поменять конкретный байт… У меня есть 4 байта , связаны общим признаком , но менять нужно один из байтов.
примерно так…

uint32_t t[350];

-------

 int s=210; // temperature 0-210 
 t[0]= (t[0] & 0x00ffffff) | ((uint32_t)s<<24);

-------

 int p=55; // percentage  1-100
 t[0]= (t[0] & 0xffff00ff) | ((int)p<<8);