今日、私はcstdintヘッダーファイルで定義されたいくつかのタイプを試していました:
std::uint16_t
などstd::uint_least16_t
..
、 などのより一般的なプラットフォーム固有のものとは異なり、サイズが正確に、または少なくともどれくらいかがわかるため、これらは非常に便利だとint
思いunsigned int
ます。
このコードがあるとしましょう:
#include <cstdint>
#include <iostream>
int main()
{
std::uint_fast16_t test = 0;
test = 65536;
std::cout << test;
return 0;
}
std::uint_fast16_t
少なくとも 2 バイトであることがわかっています。
がちょうど 2 バイトの場合uint_fast16_t
、このコードはオーバーフローのために警告を出します。しかし、私の場合uint_fast16_t
は8バイトです(以前に確認しました)。
したがって、私の場合、このコードは正常にコンパイルおよび実行されますが、他のコードでは警告が表示されます。私たちのコードは移植性がありません。これは私にとっては間違っています。変数がそのデータを保持できる場合でも、コンパイラは少なくとも警告を表示するか、より大きな型を使用するように提案する必要があります。私は正しいですか?または、これらの型の目的を誤解しましたか?
これらのフラグを指定して g++ を使用してコードをコンパイルしました
-Wall -Werror -pedantic -std=c++0x