реклама на сайте
подробности

 
 
2 страниц V  < 1 2  
Reply to this topicStart new topic
> Кросскомпиляторный код, BCC и GCC
mdmitry
сообщение Apr 30 2009, 20:47
Сообщение #16


Начинающий профессионал
*****

Группа: Свой
Сообщений: 1 215
Регистрация: 25-10-06
Из: СПб
Пользователь №: 21 648



Цитата(forever failure @ Apr 30 2009, 18:49) *
В таких случаях и надо использовать стандартный восьмибитный беззнаковый тип - uint8_t (который в большинстве случаев, но опять же не всегда - unsigned char).

Обучать uint8_t MSVC++ надо отдельно.

Конечно правильно использовать inttype.h, но не все компиляторы (например, Codewarrior for MS56F83xxx) имеют соответствующий заголовочный файл.


--------------------
Наука изощряет ум; ученье вострит память. Козьма Прутков
Go to the top of the page
 
+Quote Post
alx2
сообщение May 6 2009, 10:46
Сообщение #17


Местный
***

Группа: Участник
Сообщений: 340
Регистрация: 25-10-05
Из: Пермь, Россия
Пользователь №: 10 091



Цитата(Злодей @ Apr 30 2009, 12:41) *
На разных платформах разные результаты выполнения.
Чем все закончилось? Так и не удалось найти причину? Очень любопытно...


--------------------
Всего наилучшего,
Alex Mogilnikov
Go to the top of the page
 
+Quote Post
Злодей
сообщение May 7 2009, 16:03
Сообщение #18


Частый гость
**

Группа: Участник
Сообщений: 149
Регистрация: 29-04-08
Из: Петербург
Пользователь №: 37 142



Цитата(alx2 @ May 6 2009, 14:46) *
Чем все закончилось? Так и не удалось найти причину? Очень любопытно...


Ой как не хочется об этом вспоминать.... smile.gif

Проблема была в том, что когда пишешь вот так, это неправильно:
Код
uint32_t a;
uint32_t b;
/* ... */
a = b | ( 1 << 24 );

А когда единичке приписываешь UL всё становится хорошо и одинаково.
Код
uint32_t a;
uint32_t b;
/* ... */
a = b | ( 1UL << 24 );

Извините, растолковать что к чему не могу smile.gif
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение May 7 2009, 18:03
Сообщение #19


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(Злодей @ May 7 2009, 19:03) *
Извините, растолковать что к чему не могу smile.gif
Единица имеет тип int. Int на разных платформах имеет разный размер, иногда - меньше 24 бит.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
alx2
сообщение May 8 2009, 10:28
Сообщение #20


Местный
***

Группа: Участник
Сообщений: 340
Регистрация: 25-10-05
Из: Пермь, Россия
Пользователь №: 10 091



Цитата(Злодей @ May 7 2009, 21:03) *
Проблема была в том, что когда пишешь вот так, это неправильно:
Код
uint32_t a;
uint32_t b;
/* ... */
a = b | ( 1 << 24 );

А когда единичке приписываешь UL всё становится хорошо и одинаково.
Вы не поняли. Я говорю не об этом, а о коде функции, приведенном в первом сообщении этой темы. Здесь-то как раз все понятно - результат выражения в скобках зависит от размера типа int. Но в исходном сообщении нет ничего подобного, там все операции производятся над типами фиксированного размера! Да и вообще никакого оператора << там нет, из операций сдвига там только (crc>>1) и (crc >>= 1), что, по-моему, совершенно переносимо, и должно давать одинаковый результат...

Сообщение отредактировал alx2 - May 8 2009, 10:29


--------------------
Всего наилучшего,
Alex Mogilnikov
Go to the top of the page
 
+Quote Post
Злодей
сообщение May 8 2009, 10:59
Сообщение #21


Частый гость
**

Группа: Участник
Сообщений: 149
Регистрация: 29-04-08
Из: Петербург
Пользователь №: 37 142



Дело в том, что код у меня - индийский cranky.gif
Эти сдвиги были ещё и где-то в макросах:
Код
#define CRC32_POLYNOME ( 0x04C11DB7 | ( 1UL << 31 ) | 1UL  )
Go to the top of the page
 
+Quote Post

2 страниц V  < 1 2
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 20th July 2025 - 14:57
Рейтинг@Mail.ru


Страница сгенерированна за 0.01357 секунд с 7
ELECTRONIX ©2004-2016