2

スタンフォード大学のCS107講義から取られたこのビデオでは、教授は、void*をchar*にキャストすると、算術的にはunsignedlongにキャストするのと同じことを行うと述べているようです。

http://www.youtube.com/watch?v=_eR4rxnM7Lc&t=44m30s

問題の部分は44:30から46:00頃になります

彼はそれらが「両方とも4バイトの数字」であると言います

void*をchar*にキャストすることは理解できます。これは、算術がsizeof(char)= 1であると想定しているためです。しかし、算術が次のようになるため、unsignedlong*にキャストして同じことを行う方法がわかりません。 4単位で。何が欠けていますか?

4

2 に答える 2

2

彼はそれらが「両方とも4バイトの数字」であると言います

これは特定のプラットフォームに当てはまる可能性がありますが、どちらも一般的に当てはまるとは限りません。

しかし、算術演算は4の単位になるため、unsigned long *にキャストして同じことを行う方法がわかりません。何が欠けていますか?

彼はにキャストしていませんunsigned long*、彼はにキャストしていunsigned longます。

于 2012-06-19T08:04:03.747 に答える
0

この声明は、昨年の特定の火曜日のその教授の特定のマシンに当てはまるかもしれませんが、一般的には間違っています。char *とを同じように扱うことができればunsigned long、Cは2つの異なるタイプを必要としません。

教授がおそらく言いたかったのは、次のルールです。

任意のポインタ型(voidポインタを除く)の変数の場合、次のことが成り立ちます:(p + 1 == (T*) (((char*)p) + sizeof(*p))ここTで、はの型です*p)。つまり、ポインタに1を追加すると、それが指す型のサイズだけ増加します。

、がタイプまたは、の場合、は同じ値sizeof(char) == 1になります。これは、「自分が何をしているのかを知っている」場合を除いて想定されません。x+1xchar *unsigned longsizeof(char *) == sizeof(unsigned long)

実際の表現はさまざまな理由で異なる可能性があることに注意してください。特に、unsigned long表現のどこかにパディングビットがある可能性があるためです。

于 2012-06-19T08:14:18.157 に答える