2016-04-07 11 views
1

データバッファを操作する古いコードを見ています。私は多くの場所があります:ポインタ演算の種類

char *ptr1 ; 
char *ptr2 ; 

そして、私は2つの間のバイト数を見つける必要があります。

int distance = ptr2 - ptr1 ; 

切り捨てについて多くの警告が表示されています。タイプは何ですか

ptr2 - ptr1 

私はポインタ算術を扱う多くの答えを見つけましたが、奇妙なことにこの特定の質問に対する答えは見つかりませんでした。

Pointer Arithmetic

+0

あなたが64ビットのプラットフォーム上にいることは、ポインタが実際には64ビットのアドレスであることを意味します。 LHSタイプを64ビット整数に変更すると、おそらく警告が消えてしまいます。 – klog

答えて

5

二つのポインタを減算した結果が†std::ptrdiff_tあります。実装定義の符号付き整数です。 intが格納できるものよりも大きくなる可能性があります。

詳細については、http://en.cppreference.com/w/cpp/types/ptrdiff_tを参照してください。

†ポインタが同じ配列の要素を指す場合にのみ、ポインタを減算することができます。そうでない場合は、UBです。

+0

これらは循環バッファーなので動作します。私はこのコードの整数変換からの警告の数がきれいだったことに衝撃を受けています。 C++の神々は持続可能ではない道を歩んできました。 C++は範囲チェック付きの整数型キャストを追加しましたか?長めに短くキャストし、その値が短い範囲内にあることを確認しますか? – user3344003

+0

@ user3344003:私は最新のC++のものに追いついていないので、C++ 14以上にはユーティリティがあるかもしれませんが、そうは思わないです。 IIRCブーストには、numeric_castがあります。これは、範囲をより小さなターゲットタイプに制限する前に実際のチェックを行います。あなたの場合、オーバーヘッドになるでしょう。なぜなら、おそらくバッファサイズが 'int'の範囲内に収まるように実装されているからです。これは 'static_cast'のためによく使われ、コンパイラーに"これは安全だと分かっています。intを使ってください "と言っています。将来の開発者のための安全対策として、これを事前に 'assert()'したいかもしれません。 – GManNickG