I'm a C beginner. Having trouble understanding whats happening with this code:
#include <stdio.h>
#include <stdint.h>
int main(void)
{
uint64_t num = 99999;
uint64_t *num_ptr = #
uint8_t first_byte = ((uint8_t *)num_ptr)[0];
printf("%hhu", first_byte);
return 0;
}
This prints 159
.
I'm looking at uint8_t first_byte = ((uint8_t *)num_ptr)[0];
I'm trying to understand it this way: the uint64_t pointer num_ptr
is first cast as a uint8_t pointer, then we index into it with the square brackets to get the first byte. Is this a correct explanation? If so is it possible to index into pointers to get their partial contents without dereferencing?
99999
= 0x1869F
or if you will as a 64 bit number 0000 0000 0001 869F
9F86 0100 0000 0000
.uint8_t
is a character type on all non-exotic systems.((uint8_t *)num_ptr)[0];
Converts the 64 bit pointer to a 8 bit (character) pointer and then uses the []
operator to de-reference that pointer.0x9F
= 159 dec.%hhu
is used to print unsigned char
. The most correct conversion specifier to use for uint8_t
would otherwise be "%" PRIU8
from inttypes.h