|
|
  |
Просто мнение, АВР -> АРМ |
|
|
|
Jun 17 2009, 04:32
|

Adept
     
Группа: Свой
Сообщений: 3 469
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343

|
Цитата(AHTOXA @ Jun 17 2009, 06:53)  Хм... main.c: Код #include <stdio.h> [...]
hello! bool = true bool = true bool = true bool = false Без обману, говорите? :-) Интересный пример.  Поглядим. Согласно правилам языка (я по ++ным правилам разбираю, но думается, что в С99) оно так же. Итак, инициалиация а = 2. Согласно правилам при присвоении булу результата арифметического выражения, если результат ноль, то присваивается false, иначе - true. Таким образом, после инициализации в а - true. Далее. а = ~а Опять арифметическое выражение. При использовании була в арифметических выражениях он преобразоывается согласно правил к целому: если false, то в 0, если true - то в 1. У нас была true, значит при ~a имеем а преобразован (пусть int 16 бит) в 0x0001, а после инверсии - 0xfffe. Ну, и при присвоении обратно к булу - ненулевое значение преобразовывается в... правильно - в true.  Дальше все так же. А вот когда вы применили логическую операцию - тут никаких преобразований к целому не последовало, и был получен логичный результат. Никакого обмана.
--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
|
|
|
|
|
Jun 17 2009, 05:51
|

Adept
     
Группа: Свой
Сообщений: 3 469
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343

|
Цитата(AHTOXA @ Jun 17 2009, 12:11)  Выкрутились  Я, помнится, всё это читал. Но забыл  А с позиции здравого смысла очень сложно принять, что ~(любой bool) - это true. Но конечно этот bool лучше, чем ничего. Он даже индийское сравнение (if somevar == true) правильно обрабатывает:-) Ну, вы же помните разницу между & и && (| и ||, ~ и !). Вот тут и всплывает разница между bool и int. Достаточно помнить, что нативные операции над bool - это только лишь логические операции, а при использовании остальных начинаются преобразования типов со всеми вытекающими. Например, если вы целое присваиваете типу с плавающей точкой, то потенциально теряете точность. Это объяснимо и логично. Имхо, вся сложность C/C++ как языков и содержиться в подобных нюансах, коих весьма немало. "Дьявол прячется в мелочах" (с)
--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
|
|
|
|
|
Jun 17 2009, 07:25
|
;
     
Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509

|
Цитата(sonycman @ Jun 17 2009, 10:20)  А может кто подскажет, уважаемые, где можно почитать про хитрый uint_fast8_t? Этот тип что, обрабатывает байт как двойное слово, без накладывания масок? Но как тогда будет обработан инкремент 0хff? <stdint.h> расскажет Вам обо всем.  Обратите внимание, что компилеру по барабану, как назовется этот хитрый тип, т.к. он не встроенный - все настройки на платформенные особенности отданы на откуп прагмам и атрибутам. В общем, под таким углом зрения - ничего сложного и удивительного.
|
|
|
|
|
Jun 17 2009, 07:48
|
;
     
Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509

|
Цитата(sonycman @ Jun 17 2009, 10:33)  На кой он нужен тогда.  На той, что: 1) Как портировать софтину с АВР-8бит на АРМ, если у исходной подавляющее большинство локальных переменных char, а если это перенести на 32-битовые регистры - получим оверхед по выделению байта ? Говорено-переговорено на эту тему. 2)Как только появляется необходимость в дополнительных атрибутах (т.е. оптимизация не может автоматом утоптать все конструкции, требуется явное указание на способ обработки данных) - она отражается в stdint.h Для программера ничего не меняется - он пользуется uint8_t когда надо явно указать размер (обмен с другими девайсами, например), и _fast и _least когда надо положить алгоритм оптимально на архитектуру. Лично я пока не сталкивался с острой необходимостью в uint_least8_t. Может кто прокомментирует, где оно применимо? Что до _fast - то тут все ясно - вычисления с использованием uint_fast8_t будут быстрее.
|
|
|
|
|
Jun 17 2009, 08:15
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(_Pasha @ Jun 17 2009, 10:25)  <stdint.h> расскажет Вам обо всем.  Да ну? Код typedef __UINT_FAST8_T_TYPE__ uint_fast8_t; Что поняли из рассказа? Цитата ...этот хитрый тип, т.к. он не встроенный... или встренный. Только вот поведение тоже не всегда устраивает  Лисно у меня это кончилось тем, что завел свои типы, естественно и более-менее разбираюсь вручную, или по быстрому назначаю на них поминаемые fast8 least8
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|