что выбрать int или byte?
- Войдите на сайт для отправки комментариев
Пнд, 26/12/2016 - 23:21
В книжках для чайников пишут примеры типа таких:
1. int a[2] = {0xAE, 0xFE};
2. for (int i=0; i<10; i++)
3. int n=15; if (n>100) {...}
4. int n; n = ФУНКЦИЯ (void); // Возвращает от 0 до 9
Зачем везде используют тип int? Ведь это же целых два байта, почему не пишуть byte, или он медленнее обрабатывается микроконтроллером? Осваиваю UNO, там вроде проц 8-ми битный. Как правильнее писать в этих случаях для лучшего быстродействия byte или int? Сэкономлю ли я память, применением byte?
З.Ы. Сильно не пиныйте, чайник.
А еще при работе с COM портом, иногда засылают в порт переменную типа int.
везде - это где?
если писать в примерах для начинающих с учётом всех вариантов оптимизации кода, то трупами неофитов придётся выкрадывать мостовые.
Вообще размер int зависит от разных параметров и настроек используемой системы. Поэтому про него однозначно можно сказать что это целое со знаком. Есть предопределённые типы точно описывающие размер и знак - uint8_t, uint16_t,uint24_t,uint32_t, int8_t , int16_t, int32_t и другие. Выбирайте любые. Главное условие чтобы не получить переполнение привыполнении операций.
Стандарт Си в этом плане гибкий, определяет только что int не короче чем unsigned char (он же byte но это уже не в рамках стандарта) и не менее 2-х байт. А конкретный размер аппаратно зависим, причем минимально адресуемый размер данных принимают как unsigned char. А int реальную розрядность процессора, но не менее 2-х байт. Наибольшая производительность как раз и достигается при обработке данных размером реальной розрядность процессора. Потому и int в примерах. Но для 8битных это не так, т.к. int 2 байта. Потому для них имеет смысл активно использовать byte везде где его хватает.
Вообще-то для вас безразлично, но если вы будете писать ну очень большие программы и вам надо определять кучу функции, да так что вы их все не будете помнить. Вот вы создали фунцию void func(int A); а потом засунули туда переменную byte A; func ( А); И это разумеется не сработает. Конечно если в вашей программе 50 строк, то легко найти. А вот на 10 файлах и в классах будет тяжковато.
Вот вы создали фунцию void func(int A); а потом засунули туда переменную byte A; func ( А); И это разумеется не сработает. Конечно если в вашей программе 50 строк, то легко найти. А вот на 10 файлах и в классах будет тяжковато.
Не сработает что ?
Вообще-то для вас безразлично, но если вы будете писать ну очень большие программы и вам надо определять кучу функции, да так что вы их все не будете помнить. Вот вы создали фунцию void func(int A); а потом засунули туда переменную byte A; func ( А); И это разумеется не сработает. Конечно если в вашей программе 50 строк, то легко найти. А вот на 10 файлах и в классах будет тяжковато.
вот пример:
резалт:
Так наверно ж несрабатывает не " void func(int A); а потом засунули туда переменную byte A; func ( А);" а как раз наоборот вызов func_b(a_i). Что вполне очевидно - передать int в функцию ожидающую байт можно только урезав int .
Так наверно ж несрабатывает не "ю void func(int A); а потом засунули туда переменную byte A; func ( А);" а как раз наоборот вызов func_b(a_i). Что вполне очевидно.
Я это и пытался донести, преобразование типов никто не отменял.
Шо ж вы так криво доносите byte в int всегда приводится без ошибок. Обратно нет, вполне очевидно - передать int в функцию ожидающую байт можно только урезав int 2000=0x07d0, урежется до 0xd0=208.
Что кривого ?
Еще раз, передавая в функцию ожидающию byte, параметр int, фунция примет только младший байт, что и показал в примере.
Но qwone привел обратную ситуацию, и как Вы правильно заметили, все пройдет без ошибок.
Вот у нас 3 вида 8 битных переменных char, byte, uint8_t. Тогда что рисовать 3 функции под 1 параметр, или 6 под 2 параметра и так далее. Может проще выработать свой стиль написания и выбрать свой стандарт. Тогда можно использовать наработки которые были год назад . А еще если вы пользуетесь чужими библиотеками. И у вас нет желания в них ковыряться. Так что используется всеми привычный int. Ну или заставлять компилятор приводить к нужному типу.
Вот у нас 3 вида 8 битных переменных char, byte, uint8_t. Тогда что рисовать 3 функции под 1 параметр, или 6 под 2 параметра и так далее. Может проще выработать свой стиль написания и выбрать свой стандарт. Тогда можно использовать наработки которые были год назад . А еще если вы пользуетесь чужими библиотеками. И у вас нет желания в них ковыряться. Так что используется всеми привычный int. Ну или заставлять компилятор приводить к нужному типу.
Давайте начнем с того, что byte, uint8_t. это одно и тоже.
Вот у нас 3 вида 8 битных переменных char, byte, uint8_t. Тогда что рисовать 3 функции под 1 параметр, или 6 под 2 параметра и так далее. Может проще выработать свой стиль написания и выбрать свой стандарт. Тогда можно использовать наработки которые были год назад . А еще если вы пользуетесь чужими библиотеками. И у вас нет желания в них ковыряться. Так что используется всеми привычный int. Ну или заставлять компилятор приводить к нужному типу.
хватит бредить.
И что? Тогда ответьте почему в любых демонстрационных скетчах стоит int ?а не byte. Процессор же 8-ми битный.
И что? Тогда ответьте почему в любых демонстрационных скетчах стоит int ?а не byte. Процессор же 8-ми битный.
потому, что тупой неофит воткнёт в тип байт число 256 и будет орать, что у него блинк не мигает.
потому, что тупой неофит воткнёт в тип байт число 256 и будет орать, что у него блинк не мигает.
А что мешает тупому неофиту в int воткнуть 65536 и так же начать орать. Тем более мы такое наблюдаем регулярно. Тем более эта тема создана точно таким же оригиналом.
Вот еще непонятка.
И что? Тогда ответьте почему в любых демонстрационных скетчах стоит int ?а не byte. Процессор же 8-ми битный.
я думаю, это как в школе учили, есть целочисленный и вещественный.
а то, что целочисленный (как и вещественный) еще может делится на положительный и отрицательный, и за это отвечает старший бит, это на две страницы ниже, там уже не читают.
что проще integer - целый, а вот byte, это уже не понятно вроде и полвинка integer, а вроде и нет.
посылаются 8 бит ASCII символа "5", потом стоп бит, потом опять 8 бит ASCII символа "5" потом стоп бит.
Задача компилятора преобразовать число, не зависимо от его типа в строку "55" и выкинуть это в терминал.
в итоге на экране вы видете "55".
и так по анологии, если вы шлете в терминал
8+1 ('1'), 8+1 ('2'), 8+1 ('3'), 8+1 ('4'), 8+1 ('5'), 8+1 ('6'),8+1 ('7'), 8+1 ('8')= 64 + 8 = 72 бита.
Выбирайте клинское. Ну, на худой конец, пепси.