Каковы размеры каждого примитивного типа данных в SAMD51 Metro M4 Express?

Каковы размеры данных всех примитивных типов данных в реализации Metro M4 Express SAMD51 C++? В некоторых реализациях C++ значение int имеет 16 бит, а в других реализациях-32 бита. Является

, 👍0

Обсуждение

Это зависит от модели данных компилятора для целевого процессора. Но я бы предпочел использовать вместо этого int16_t/int32_t. Это намного лучше для переносимости., @KIIV


2 ответа


Лучший ответ:

0

И это единственное различие в размерах основных типов. На 8-разрядных ардуино значение int равно 16 битам, а на 32-разрядных-32 битам.

  • short-16 бит
  • длина составляет 32 бита
  • long long-64 бит

https://en.cppreference.com/w/cpp/language/types

,

0

Вот скетч, чтобы быстро узнать максимальные значения 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