私の理解をテストするために、この小さなコードを書きました。しかし、その背後にあるいくつかの事実を理解していませんでした。私は 64 ビットのリトル エンディアン マシンで作業しています。したがって、任意のポインターは 8 バイトです。つまり
#include<stdio.h>
int main(){
char *c = (char *)0x12345678889;
long a = 1;
int b = (long)(c-a);
/* int cc = (int)(c-a); gives compiler error */
printf("val = %x and b = %x", c-a,b);
return 0;
}
Output
val = 45678888 and b = 45678888
開始アドレスが 100 だとします。したがって、char*
100->89、101->88 ... 105->12 としてメモリに格納され、バイト 106 と 107 は使用されません。そもそもこの私の推測は正しいのでしょうか?int と long は 64 ビット マシンでは 4 バイトであるため、100、101、102、および 103 から開始し、これらのバイトのみを考慮します。45678889 - 1 = 45678888.私の理解は正しいですか? 最後に、コメント行でコンパイラ エラーが発生している間はわかりません。コンパイラは、上記の行を暗黙的に型キャストしました。しかし、なぜ下にないのですか?