#include <stdio.h>

typedef unsigned long long int uint64_t;
typedef unsigned short uint16_t;
typedef unsigned long long int * uintptr_t;

uint64_t get_value() {
	return 0x1020304050607080ULL;
}

int main(void) {
	uint64_t value = get_value();
	uintptr_t addr = (uintptr_t)&value;
	
	uint16_t u16 = *(uint16_t*)addr;
	uint16_t u16_2 = *(uint16_t*)&value;
	uint64_t u64 = (*(uint64_t*)addr) & 0xFFFF;
	uint16_t* ptr = (uint16_t*)&value;
	printf("u16 = 0x%x, u16_2 = 0x%x, u64 = 0x%llx, *ptr=0x%x\n", u16, u16_2, u64, *ptr);
	
	printf("*ptr = 0x%x\n", *ptr);
	printf("--- loop start ---\n");
	for (int i=0; i<4; ++i) {
		printf("*ptr = 0x%x\n", *ptr);
		ptr++;
	}
	
	printf("value = 0x%llx\n", value);
	
	return 0;
}
