intのデータ長は何バイトか

前の記事(いつのまにかIRremoteESP8266の仕様が変わってる? - てらもろす)の問題でしばし頭を抱えることになった原因の一つが、int型は2バイト(16ビット)だと思い込んでいたこと。

私の環境の場合(というかesp-wroom-02の場合?)、int型は4バイトだった。

手元のC言語のテキストには「本書ではintは16ビットと想定する(ただし処理系によって異なる)」みたいに書いてある。
手元のArduinoのテキストには「int:2バイト:16ビット符号付き整数値。-32,768から32767の整数値を格納。ただし、処理系によっては32ビット符号付き整数値。」と書いてある。

そんなわけで、int型は2バイト(16ビット)だと無意識のうちに思い込んでいた。それゆえ、なぜ「unsigned intからuint16_tへのconversionがダメ」みたいなエラーが表示されるんだろう、と思っていた。

試してみた。実際に書き込んでシリアルモニタで見る。

    Serial.print("int:");
    Serial.println(sizeof(int));
    Serial.print("unsigned int:");
    Serial.println(sizeof(unsigned int));
    Serial.print("uint16_t:");
    Serial.println(sizeof(uint16_t));
    Serial.print("unsigned short int:");
    Serial.println(sizeof(unsigned short int));

結果↓

    int:4
    unsigned int:4
    uint16_t:2
    unsigned short int:2

(2017/8/21追記)
公式のリファレンスには、Arduino Unoなら2バイト、Arduino Dueなら4バイトと書いてありました。

On the Arduino Uno (and other ATMega based boards) an int stores a 16-bit (2-byte) value. This yields a range of -32,768 to 32,767 (minimum value of -2^15 and a maximum value of (2^15) - 1).
On the Arduino Due and SAMD based boards (like MKR1000 and Zero), an int stores a 32-bit (4-byte) value. This yields a range of -2,147,483,648 to 2,147,483,647 (minimum value of -2^31 and a maximum value of (2^31) - 1).