что выбрать int или byte?

wic
Offline
Зарегистрирован: 26.12.2016

В книжках для чайников пишут примеры типа таких:

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.

Клапауций 234
Offline
Зарегистрирован: 24.10.2016

везде - это где?

если писать в примерах для начинающих с учётом всех вариантов оптимизации кода, то трупами неофитов придётся выкрадывать мостовые.

nik182
Offline
Зарегистрирован: 04.05.2015

Вообще размер int зависит от разных параметров и настроек используемой системы. Поэтому про него однозначно можно сказать что это целое со знаком. Есть предопределённые типы точно описывающие размер и знак - uint8_t, uint16_t,uint24_t,uint32_t, int8_t , int16_t, int32_t и другие. Выбирайте любые. Главное условие чтобы не получить переполнение привыполнении операций.

Logik
Offline
Зарегистрирован: 05.08.2014

Стандарт Си в этом плане гибкий, определяет только что int не короче чем unsigned char (он же byte но это уже не в рамках стандарта) и не менее 2-х байт. А конкретный размер аппаратно зависим, причем минимально адресуемый размер данных принимают как unsigned char. А int реальную розрядность процессора, но не менее 2-х байт. Наибольшая производительность как раз и достигается при обработке данных размером реальной розрядность процессора. Потому и int в примерах. Но для 8битных это не так, т.к. int 2 байта. Потому для них имеет смысл активно использовать byte везде где его хватает.  

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Вообще-то  для вас безразлично, но если вы будете писать ну очень большие программы и вам надо определять кучу функции, да так что вы их все не будете помнить. Вот вы создали фунцию void func(int A);  а потом засунули туда переменную byte A; func ( А); И это разумеется не сработает.  Конечно если в вашей программе 50 строк, то легко найти. А вот на 10 файлах и в классах будет тяжковато.

xDriver
xDriver аватар
Offline
Зарегистрирован: 14.08.2015

qwone пишет:

Вот вы создали фунцию void func(int A);  а потом засунули туда переменную byte A; func ( А); И это разумеется не сработает.  Конечно если в вашей программе 50 строк, то легко найти. А вот на 10 файлах и в классах будет тяжковато.

Не сработает что ?

xDriver
xDriver аватар
Offline
Зарегистрирован: 14.08.2015

qwone пишет:

Вообще-то  для вас безразлично, но если вы будете писать ну очень большие программы и вам надо определять кучу функции, да так что вы их все не будете помнить. Вот вы создали фунцию void func(int A);  а потом засунули туда переменную byte A; func ( А); И это разумеется не сработает.  Конечно если в вашей программе 50 строк, то легко найти. А вот на 10 файлах и в классах будет тяжковато.

вот пример:

void func_i(int a) {
  Serial.print("a = ");  
  Serial.println(a);  
}
void func_b(byte a) {
  Serial.print("a = ");  
  Serial.println(a);  
}
void setup() {
  Serial.begin(9600);  

  int a_i = 2000;
  byte a_b = 33;

  func_i(a_i);
  func_i(a_b);

  func_b(a_i);
  func_b(a_b);
}

void loop() {
}

резалт:

a = 2000
a = 33
a = 208
a = 33

 

Logik
Offline
Зарегистрирован: 05.08.2014

Так наверно ж несрабатывает не " void func(int A);  а потом засунули туда переменную byte A; func ( А);" а как раз наоборот  вызов func_b(a_i). Что вполне очевидно - передать int в функцию ожидающую байт можно только урезав int  .

xDriver
xDriver аватар
Offline
Зарегистрирован: 14.08.2015

Logik пишет:

Так наверно ж несрабатывает не "ю void func(int A);  а потом засунули туда переменную byte A; func ( А);" а как раз наоборот  вызов func_b(a_i). Что вполне очевидно.

Я это и пытался донести, преобразование типов никто не отменял.

Logik
Offline
Зарегистрирован: 05.08.2014

Шо ж вы так криво доносите byte в int всегда приводится без ошибок. Обратно нет,  вполне очевидно - передать int в функцию ожидающую байт можно только урезав int  2000=0x07d0, урежется до 0xd0=208

wic
Offline
Зарегистрирован: 26.12.2016
int a=55;
Serial.print(a); 
я так понял, что в порт уйдет 8 бит данных, да?
Вот еще непонятка.
Компилирую char a[] = {1,2,3,4,5};
В ответ - "Глобальные переменные используют 9 байт (0%) динамической памяти, оставляя 2 039 байт для локальных переменных"
Компилирую int a[] = {1,2,3,4,5};
В ответ то же самое. 
Это значит, что компилятор сам оптимизирует, и можно смело везде писать int, в надежде, что компилятор сам оптимизирует код по скорости и объему?
 
 
 
xDriver
xDriver аватар
Offline
Зарегистрирован: 14.08.2015

Что кривого ? 

Еще раз, передавая в функцию ожидающию byte, параметр int, фунция примет только младший байт, что и показал в примере.

Но qwone привел обратную ситуацию, и как Вы правильно заметили, все пройдет без ошибок.

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Вот у нас 3 вида 8 битных переменных   char, byte, uint8_t. Тогда что рисовать 3 функции под 1 параметр, или 6 под 2 параметра и так далее.   Может проще выработать свой стиль написания и выбрать свой стандарт. Тогда можно использовать наработки которые были год назад .  А еще если вы пользуетесь чужими библиотеками. И у вас нет желания в них ковыряться.  Так что используется всеми привычный int. Ну или заставлять компилятор приводить к нужному типу.

xDriver
xDriver аватар
Offline
Зарегистрирован: 14.08.2015

qwone пишет:

Вот у нас 3 вида 8 битных переменных   char, byte, uint8_t. Тогда что рисовать 3 функции под 1 параметр, или 6 под 2 параметра и так далее.   Может проще выработать свой стиль написания и выбрать свой стандарт. Тогда можно использовать наработки которые были год назад .  А еще если вы пользуетесь чужими библиотеками. И у вас нет желания в них ковыряться.  Так что используется всеми привычный int. Ну или заставлять компилятор приводить к нужному типу.

Давайте начнем с того, что byte, uint8_t.  это одно и тоже.

Клапауций 234
Offline
Зарегистрирован: 24.10.2016

qwone пишет:

Вот у нас 3 вида 8 битных переменных   char, byte, uint8_t. Тогда что рисовать 3 функции под 1 параметр, или 6 под 2 параметра и так далее.   Может проще выработать свой стиль написания и выбрать свой стандарт. Тогда можно использовать наработки которые были год назад .  А еще если вы пользуетесь чужими библиотеками. И у вас нет желания в них ковыряться.  Так что используется всеми привычный int. Ну или заставлять компилятор приводить к нужному типу.

хватит бредить.

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

И что? Тогда ответьте почему в любых демонстрационных скетчах стоит int ?а не byte. Процессор же 8-ми битный.

Клапауций 234
Offline
Зарегистрирован: 24.10.2016

qwone пишет:

И что? Тогда ответьте почему в любых демонстрационных скетчах стоит int ?а не byte. Процессор же 8-ми битный.

потому, что тупой неофит воткнёт в тип байт число 256 и будет орать, что у него блинк не мигает.

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Клапауций 234 пишет:

потому, что тупой неофит воткнёт в тип байт число 256 и будет орать, что у него блинк не мигает.

А что мешает тупому неофиту в int воткнуть 65536 и так же начать орать. Тем более мы такое наблюдаем регулярно. Тем более эта тема создана точно таким же оригиналом.

xDriver
xDriver аватар
Offline
Зарегистрирован: 14.08.2015

wic пишет:

Вот еще непонятка.

Компилирую char a[] = {1,2,3,4,5};
В ответ - "Глобальные переменные используют 9 байт (0%) динамической памяти, оставляя 2 039 байт для локальных переменных"
Компилирую int a[] = {1,2,3,4,5};
В ответ то же самое. 
Это значит, что компилятор сам оптимизирует, и можно смело везде писать int, в надежде, что компилятор сам оптимизирует код по скорости и объему?
нет, компилятор действительно оптимизирует код и видит что в даьнейшем ваш масив ни где не используется
но стоит написать где нибудь a[0] = 1;
все встанет на свои места.
xDriver
xDriver аватар
Offline
Зарегистрирован: 14.08.2015

qwone пишет:

И что? Тогда ответьте почему в любых демонстрационных скетчах стоит int ?а не byte. Процессор же 8-ми битный.

я думаю, это как в школе учили, есть целочисленный и вещественный.

а то, что целочисленный (как и вещественный) еще может делится на положительный и отрицательный, и за это отвечает старший бит, это на две страницы ниже, там  уже не читают.

что проще integer - целый, а вот  byte, это уже не понятно вроде и полвинка integer, а вроде и нет.

xDriver
xDriver аватар
Offline
Зарегистрирован: 14.08.2015

wic пишет:

int a=55;
Serial.print(a); 
я так понял, что в порт уйдет 8 бит данных, да?
Вы тут немножко путаете, типы данных и что уходит в терминал.
В терминал уходят данные, (чтоб меня тут не сожгли на костре) в зависимости от его настоек.
В простейшем и подавляющем большинстве случаев 8 бит данных (символ) и один стоп бит, на той скорости на которой он был открыт.
Соотвественно 
int a=55;
Serial.print(a); 

посылаются 8 бит ASCII символа "5", потом стоп бит, потом опять 8 бит ASCII символа "5" потом стоп бит.

Задача компилятора преобразовать число, не зависимо от его типа в строку "55" и выкинуть это в терминал.

в итоге на экране вы видете "55".

и так по анологии, если вы шлете в терминал 

Serial.print("12345678");

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 бита.

 
 

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

wic пишет:

что выбрать int или byte?

Выбирайте клинское. Ну, на худой конец, пепси.