Вопрос

past0r
Offline
Зарегистрирован: 29.03.2012

Очень часто встречаю в примерах скетчей следующие строки:

uint8_t u8num = 0;
uint32_t u32num = 0;

Пытался разобраться самостоятельно что-то и с чем это едят... но не смог, подскажите что это ... или посоветуйте чтиво какое ...

Спаисбо! 

maksim
Offline
Зарегистрирован: 12.02.2012

Вроде бы так - uint8_t - тип целого числа без знака длиной 8 бит т.е. все равно, что байт - byte, а uint32_t - тип целого числа без знака длиной 32 бит т.е. все равно, что 4 байта - unsigned long .

past0r
Offline
Зарегистрирован: 29.03.2012

В интернете я прочел тоже самое, но все равно не понимаю ... а в каких случаях его необходимо приминять?

Где то на просторах нашел информацию, что если объявлен uint8_t, то в ОЗУ выделяется 1 байт...  все верно?

Sky
Offline
Зарегистрирован: 04.04.2012

 Ага верно, но байт это 2^8=256 а если значение составляет 65536 или более?

maksim
Offline
Зарегистрирован: 12.02.2012

да, то же самое происходит, когда объявляете byte

chervyachok
chervyachok аватар
Offline
Зарегистрирован: 22.12.2011

Если в коде критично важна разрядность целочисельных типов даных то вместо int, char, short и т.д  лучше использовать такое определение.

int8_t, int_16, int_32, int_64 - как выше сказано 8,16,32,64 длина, могут принимать минус и плюс, приставка u (uint_8) - тоже только с плюсом. 

Вообще "хорошым тоном" написания кода считаеться использование именно таких определений, а связано ето с возможной несовместимостю различных компиляторов и соответственно переноса програмного кода. 

Из своего опыта: проблем в использовании одного и другого замечено не было.

maksim
Offline
Зарегистрирован: 12.02.2012

Надо принять к сведению. А интересно uint1_t скомпилируется как boolean

maksim
Offline
Зарегистрирован: 12.02.2012

Нет не компилирует, так вот интересно сколько памяти выделяется, когда обявляем boolean, по идей должен 1 бит.

maksim
Offline
Зарегистрирован: 12.02.2012

past0r пишет:
Пытался разобраться самостоятельно что-то и с чем это едят... но не смог, подскажите что это ... или посоветуйте чтиво какое ...

 int8_t      |  char                       |   от -128 до 127
 uint8_t    |  byte, unsigned char |   от 0 до 255
 int16_t    |  int                          |   от -32768 до 32767
 uint16_t  |  unsigned int, word   |   от 0 до 65535 
 int32_t    |  long                        |  от  -2147483648 до 2147483647 
 
uint32_t  |  unsigned long          |  от 0 до 4294967295

и еще бывают int64_t и  uint64_t

past0r
Offline
Зарегистрирован: 29.03.2012

:) Cпс! 

saftik
Offline
Зарегистрирован: 08.04.2015

спасибо макс, теперь дощло 
там где "u" это unsigned тоесть положительное число

sandr4
sandr4 аватар
Offline
Зарегистрирован: 11.02.2015

Еще раз СПАСИБО ОГРОМНОЕ maksim.

Denitto
Offline
Зарегистрирован: 25.09.2016

Спасибо

Грамотрый развернутый ответ

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

maksim пишет:

Нет не компилирует, так вот интересно сколько памяти выделяется, когда обявляем boolean, по идей должен 1 бит.

Минимальный адресуемый объем памяти равен 1 байту. Соответственно, меньше выделить невозможно в принципе. Но никто не мешавет в своей программе использовать одно многобитное число как совокупность нескольких булевых признаков.

reticular
Offline
Зарегистрирован: 09.06.2016

теоретически все верно.

Пожалуйста проверьте все типы практически

в ардуино например нет от -128 до 127

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

 Отныне и вовеки веков int8_t в ардуине не применять!

EuBeginer
Offline
Зарегистрирован: 16.11.2015

Дима привет! А что случилось? 

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

EuBeginer,  шутка юмора такой. После прочтения последней строчки в #14.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

reticular пишет:

теоретически все верно.

Пожалуйста проверьте все типы практически

в ардуино например нет от -128 до 127

Зато а С есть. Называется char.

EuBeginer
Offline
Зарегистрирован: 16.11.2015

Шутники :-)

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

reticular пишет:

в ардуино например нет от -128 до 127

я запретил char

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

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

я запретил char

А что вместо?

arduino328
Offline
Зарегистрирован: 01.09.2016

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

я запретил char

А я разрешил!

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

arduino328 пишет:

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

я запретил char

А я разрешил!

это невозможно - я не разрешал разрешать.

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

andriano пишет:

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

я запретил char

А что вместо?

рептилоиды

arduino328
Offline
Зарегистрирован: 01.09.2016

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

arduino328 пишет:

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

я запретил char

А я разрешил!

я не разрешал разрешать.

А я не разрешал запрещать!

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

maksim пишет:

Нет не компилирует, так вот интересно сколько памяти выделяется, когда обявляем boolean, по идей должен 1 бит.

Неправильная идея.

Минимально адресуемый объем памяти 1 байт, соответственно, и выделить менее одного байта невозможно. (в зависимости от менеджера памяти минимальная порция может быть и больше, напимер, 4 или 8 байт)

stepan_sotnikov
Offline
Зарегистрирован: 06.04.2019

Доброго времени суток. Столкнулся с критикой компилятора. Не могу сообразить, что именно ему не нравится... и что он этим хочет мне обяснить. Как раз вопрос с типом данных. Если заменяю их на int то ругатся перестает.
 

C:\Users\user\Documents\Arduino\compas_1.2.1\compas_1.2.1.ino: In function 'boolean readMag(int16_t*, int16_t*, int16_t*)':

C:\Users\user\Documents\Arduino\compas_1.2.1\compas_1.2.1.ino:96:35: warning: ISO C++ says that these are ambiguous, even though the worst conversion for the first is better than the worst conversion for the second:

   Wire.requestFrom(Adres_for_Mg, 7);

                                   ^

In file included from C:\Users\user\Documents\Arduino\compas_1.2.1\compas_1.2.1.ino:28:0:

C:\Program Files (x86)\Arduino\hardware\arduino\avr\libraries\Wire\src/Wire.h:64:13: note: candidate 1: uint8_t TwoWire::requestFrom(int, int)

     uint8_t requestFrom(int, int);

             ^

C:\Program Files (x86)\Arduino\hardware\arduino\avr\libraries\Wire\src/Wire.h:61:13: note: candidate 2: uint8_t TwoWire::requestFrom(uint8_t, uint8_t)

     uint8_t requestFrom(uint8_t, uint8_t);

             ^

C:\Users\user\Documents\Arduino\compas_1.2.1\compas_1.2.1.ino: In function 'boolean readAccGir(int16_t*, int16_t*, int16_t*, int16_t*, int16_t*, int16_t*, int16_t*)':

C:\Users\user\Documents\Arduino\compas_1.2.1\compas_1.2.1.ino:112:44: warning: ISO C++ says that these are ambiguous, even though the worst conversion for the first is better than the worst conversion for the second:

   Wire.requestFrom(Adres_for_AcGy, 14, true);

                                            ^

In file included from C:\Users\user\Documents\Arduino\compas_1.2.1\compas_1.2.1.ino:28:0:

C:\Program Files (x86)\Arduino\hardware\arduino\avr\libraries\Wire\src/Wire.h:65:13: note: candidate 1: uint8_t TwoWire::requestFrom(int, int, int)

     uint8_t requestFrom(int, int, int);

             ^

C:\Program Files (x86)\Arduino\hardware\arduino\avr\libraries\Wire\src/Wire.h:62:13: note: candidate 2: uint8_t TwoWire::requestFrom(uint8_t, uint8_t, uint8_t)

     uint8_t requestFrom(uint8_t, uint8_t, uint8_t);

             ^