powered by simpleCommunicator - 2.0.58     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Посылка прием int32_t
11 сообщений из 11, страница 1 из 1
Посылка прием int32_t
    #39771821
jenya7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Проверяю
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
int32_t val = 0;
int32_t s_val;
uint8_t g_data[4];

int main()
{
    val = -239;
    
    while (1)
    {
       g_data[0] = val;
       g_data[1] = val>>8;
       g_data[2] = val>>16;
       
       s_val = (int32_t) ( (g_data[2]<<16) | (g_data[1]<<8) | g_data[0] );  //16776977
        
    }
    
  //return 0;
}


s_val = 16776977 даже явное приведенте типов не помогает :(

Модератор: Тема перенесена из форума "Программирование".
...
Рейтинг: 0 / 0
Посылка прием int32_t
    #39771827
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ты в курсе что знак хранится в старшем разряде, а ты его проигнорировал?

В int32_t 4 байта, а не 3. Так работает
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
int32_t val = 0;
int32_t s_val;
uint8_t g_data[4];

int main()
{
	val = -239;

	g_data[0] = val;
	g_data[1] = val >> 8;
	g_data[2] = val >> 16;
	g_data[3] = val >> 24;

	s_val = (int32_t)((g_data[3] << 24) | (g_data[2] << 16) | (g_data[1] << 8) | g_data[0]);

	printf("%d == %d\n", val, s_val);

	return 0;
}



Отрицательные числа хранятся так
...
Рейтинг: 0 / 0
Посылка прием int32_t
    #39771831
jenya7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima T,

ой. точно. знак то в последнем бите.
у меня не хватает байтов для посылки. решил укоротить переменную. мне 24 бита хватает. но в 32-х битной системе я не могу как то схитрить и сократить байт? :)
...
Рейтинг: 0 / 0
Посылка прием int32_t
    #39771833
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jenya7,

а что хочется получить?
...
Рейтинг: 0 / 0
Посылка прием int32_t
    #39771834
jenya7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Изопропилjenya7,

а что хочется получить?
у меня мейлбокс 8 байт. один байт не впихивается. вот я решил его подсократить. все равно значение не будет больше 24 бит.
...
Рейтинг: 0 / 0
Посылка прием int32_t
    #39771837
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если хочешь в 3 байта уместить, то так
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
int main()
{
	val = -239;

	g_data[0] = val;
	g_data[1] = val >> 8;
	g_data[2] = ((val >> 16) & 0x7F) | ((val >> 24) & 0x80);

	s_val = (int32_t)(((g_data[2] & 0x80) == 0 ? 0 : 0xFF000000) | (g_data[2] << 16) | (g_data[1] << 8) | g_data[0]);

	printf("%d == %d\n", val, s_val);

	return 0;
}


но учти что старший бит знаковый, т.е. у тебя 23 бита под значение.
...
Рейтинг: 0 / 0
Посылка прием int32_t
    #39771839
jenya7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima TЕсли хочешь в 3 байта уместить, то так
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
int main()
{
	val = -239;

	g_data[0] = val;
	g_data[1] = val >> 8;
	g_data[2] = ((val >> 16) & 0x7F) | ((val >> 24) & 0x80);

	s_val = (int32_t)(((g_data[2] & 0x80) == 0 ? 0 : 0xFF000000) | (g_data[2] << 16) | (g_data[1] << 8) | g_data[0]);

	printf("%d == %d\n", val, s_val);

	return 0;
}


но учти что старший бит знаковый, т.е. у тебя 23 бита под значение.
о. спасибо. но почему 0xFF000000? не 0x80000000?
...
Рейтинг: 0 / 0
Посылка прием int32_t
    #39771841
jenya7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
а понял. спасибо.
...
Рейтинг: 0 / 0
Посылка прием int32_t
    #39771844
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jenya7но почему 0xFF000000? не 0x80000000?
Я тебе выше ссылку дал как отрицательные числа хранятся 21805681 , почитай, там всего несколько абзацев.
...
Рейтинг: 0 / 0
Посылка прием int32_t
    #39771846
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А еще проще - приведи свое отрицательное к положительному, прибавь 2^23 перед отправкой, после приема вычти.
...
Рейтинг: 0 / 0
Посылка прием int32_t
    #39771847
jenya7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima TА еще проще - приведи свое отрицательное к положительному, прибавь 2^23 перед отправкой, после приема вычти.
круто. спасибо.
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Посылка прием int32_t
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]