Каковы размеры каждого примитивного типа данных в SAMD51 Metro M4 Express?
Каковы размеры данных всех примитивных типов данных в реализации Metro M4 Express SAMD51 C++? В некоторых реализациях C++ значение int
имеет 16 бит, а в других реализациях-32 бита. Является
2 ответа
Лучший ответ:
И это единственное различие в размерах основных типов. На 8-разрядных ардуино значение int равно 16 битам, а на 32-разрядных-32 битам.
short
-16 битдлина
составляет 32 битаlong long
-64 бит
https://en.cppreference.com/w/cpp/language/types
Вот скетч, чтобы быстро узнать максимальные значения unsigned на любой архитектуре и вывести из них разрядность (мне пришлось использовать sprintf, потому что Serial.println(unsigned long long) не работал на моем компьютере):
#include <limits.h>
#define sprintfln(args...) { char _qsx6_[200]; snprintf(_qsx6_, 200, args); Serial.println(_qsx6_); } // _qsx6_ may collide with local var
void setup()
{
Serial.begin(115200);
unsigned char uc = 0; uc=~uc; Serial.println(uc);
unsigned short us = 0; us=~us; Serial.println(us);
unsigned int ui = 0; ui=~ui; Serial.println(ui);
unsigned long ul = 0UL; ul=~ul; Serial.println(ul);
unsigned long long ull = 0ULL; ull=~ull; // doesn't work: Serial.println(~ull);
sprintfln("char:%u short:%u int:%u long:%lu long long:%llu", uc, us, ui, ul, ull);
sprintfln("char:%u short:%u int:%u long:%lu long long:%llu", UCHAR_MAX, USHRT_MAX, UINT_MAX, ULONG_MAX, ULLONG_MAX);
sprintfln("char:%u short:%u int:%u long:%u long long:%u", sizeof(uc), sizeof(us), sizeof(ui), sizeof(ul), sizeof(ull));
sprintfln("pointer:%u", sizeof(&uc));
}
На Arduino Due этого (я ожидаю, что это будет то же самое на SAMD51):
char:255
short:65535
int:4294967295
long:4294967295
long long:18446744073709551615
char:1 short:2 int:4 long:4 long long:8
pointer:4
Обычно вы могли бы включить "limits.h", но кажется, что unsigned long long отсутствует (по крайней мере, в срок). Хммм, я не ожидал, что инт и лонг будут одинаковыми, приятно знать.
1. Обратите внимание, что "unsigned int ui = -1;" - это допустимый способ установить для числа без знака его максимальное значение. 2. sizeof(int) " может быть более удобным. 3.
int и
long` являются 32-разрядными в большинстве 32-разрядных сред и даже в 64-разрядных Windows. 4. Было бы здорово иметь также размер указателей., @Edgar Bonet
О, забыл о sizeof (), который тоже работает с указателями. На ваше предложение (1) я бы прокомментировал, что "unsigned long long x = -1LL" - это странный стиль с преобразованием типов, и компилятор должен поступать правильно. Я бы этого не сделал., @cat
- Есть ли ограничения на размер массива в Arduino Mega 2560?
- Неожиданные результаты при создании 32-битного целого числа из массива байтов
- Int64_t, он же long long, действует как int32_t и переполняется на 2^31.
- Определить, имеет ли переменная арифметический тип
- Преобразование строки в целое число
- C++ против языка Arduino?
- Как использовать SPI на Arduino?
- Как получить тип данных переменной?
Это зависит от модели данных компилятора для целевого процессора. Но я бы предпочел использовать вместо этого int16_t/int32_t. Это намного лучше для переносимости., @KIIV