Я хотел бы знать, есть ли разница между:
- Приведение примитивной переменной в другой примитивный тип
- Выявление разметки примитивного адреса переменной указателю другого примитивного типа
Я также хотел бы знать, есть ли веская причина когда-либо использовать (2) над (1). Я видел (2) в устаревшем коде, поэтому мне было интересно. Из контекста я не мог понять, почему (2) предпочитают (1). И из следующего теста, который я написал, я пришел к выводу, что по крайней мере поведение upcast в обоих случаях одинаково:
/* compile with gcc -lm */
#include <stdio.h>
#include <math.h>
int main(void)
{
unsigned max_unsigned = pow(2, 8 * sizeof(unsigned)) - 1;
printf("VALUES:\n");
printf("%u\n", max_unsigned + 1);
printf("%lu\n", (unsigned long)max_unsigned + 1); /* case 1 */
printf("%lu\n", *((unsigned long *)&max_unsigned) + 1); /* case 2 */
printf("SIZES:\n");
printf("%d\n", sizeof(max_unsigned));
printf("%d\n", sizeof((unsigned long)max_unsigned)); /* case 1 */
printf("%d\n", sizeof(*((unsigned long *)&max_unsigned))); /* case 2 */
return 0;
}
Вывод:
VALUES:
0
4294967296
4294967296
SIZES:
4
8
8
С моей точки зрения, не должно быть никаких различий между (1) и (2), но я хотел проконсультироваться с экспертами SO для проверки работоспособности.