Я написал этот небольшой код, чтобы проверить свое понимание. Но не понял некоторых фактов. Я работаю над 64-разрядной мини-машиной. Таким образом, любой указатель имеет 8 байтов. Это означает, чтоtypecasting in c между типами данных
#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 составляют 4 байта на 64-битной машине, она начнется с 100,101,102 и 103 и рассмотрит только эти байты. Итак, 45678889 - 1 = 45678888. Правильно ли я понимаю? И, наконец, я не понимаю, в то время как прокомментированная строка дает ошибку компилятора. Компилятор неявно приписывал указанную выше строку. Но почему не ниже?
«int и long 4 байта в 64-битной машине» - необязательно. По моему, 'sizeof (long) == 8'. –
«char *» - это адрес, который на большинстве машин равен «4 байтам», поэтому «char * c = (char *) 0x12345678889;' не имеет смысла. Я считаю, что компилятор проигнорирует отставание '889'. –
Кроме того, если у вас есть достойный компилятор, вы получите объяснение об ошибке. Мой GCC говорит «отбрасывается из указателя в целое число разного размера», что довольно описательно. –