1

移植可能な方法で文字のサイズを確実に決定する方法を考えていました。AFAIK sizeof(char) は使用できません。これは、バイトが 16 ビットまたは多かれ少なかれあるシステムでも、常に 1 になるためです。

たとえば、正確な大きさを知る必要があるビットを扱う場合、このコードが文字の実際のサイズを与えるかどうか、コンパイラーがそれをどう考えるかに関係なく、私は疑問に思っていました。IMO ポインターは、コンパイラーによって正しいサイズに増やす必要があるため、正しい値が必要です。私はこれで正しいですか、それともポインター演算に隠れた問題があり、システムによっては間違った結果をもたらす可能性がありますか?

int sizeOfChar()
{
    char *p = 0;
    p++;
    int size_of_char = (int)p;
    return size_of_char;
}
4

3 に答える 3

6

あなたが「正しい」(またはタイトルのように「信頼できる」)と考えるものは明確ではないと思います。

「1 バイトは 8 ビット」が正しいと思いますか? もしそうなら、プラットフォームCHAR_BITが 16 の場合、もちろん計算するだけで答えが得られます:

const int octets_per_char = CHAR_BIT / 8;

ポインタートリックを行う必要はありません。また、トリックはトリッキーです。

アドレス指定可能なメモリの最小単位が 16 ビットのアーキテクチャでは、アドレス 0x0000 1に16 ビット、アドレス 0x0001 に別の16 ビットなどがあります。

したがって、ポインターは 0x0000 から 0x0001 にインクリメントされる可能性が高いため、この例では結果 1 が計算されますが、それは期待どおりに計算されないようです。

1簡潔にするために 16 ビットのアドレス空間を使用しています。これにより、アドレスが読みやすくなります。

于 2013-05-15T10:11:36.613 に答える