Aligned to 32 bits: DEADBEE0 80 DEADBEE1 00 DEADBEE2 10 DEADBEE3 57 DEADBEE4 F5 DEADBEE5 A0 DEADBEE6 ?? DEADBEE7 ?? Aligned to 16 bits: DEADBEE0 ?? DEADBEE1 ?? DEADBEE2 80 DEADBEE3 00 DEADBEE4 10 DEADBEE5 57 DEADBEE6 F5 DEADBEE7 A0 In the first case, the CPU can read the first 32 bits of the MAC address in one operation, but in the second case the first 32 bits cross a 32bit boundary, so the CPU needs to perform two reads, and then it make need yet another read to get the last 16 bits. In such an architecture, it may be quicker to compare the addresses in 16bit chunks at a time, even it takes more bitwise operations. 
: "alignment" means that the address of an object is a multiple of an integer, usually a power of 2. In the case of the above function, "aligned to 16 bits" means that this is true: (uintptr_t)addr1 % 2 == 0. Nothing more. 
the compiler pads the 16 bits ( end of mac address ) with an extra 16 bits so it can be 32 bit aligned,correct? 
but it could just as easily be the following right? 
"alignment" means that the address of an object is a multiple of an integer 
still not too sure of this though, in this case ( aligned to 16 bits ) ( (uintptr_t)addr1 % 2 == 0 ) == ( (uintptr_16)addr1 % 2 == 0) right? how would (uintptr_16)addr1 % 2 == 0 relate to the addressing scheme? 
the compiler pads the 16 bits ( end of mac address ) with an extra 16 bits so it can be 32 bit aligned,correct? The function receives a byte pointer. What's at addr1 + 6 is completely unknown. It could be padding, it could be another MAC, it could be something else entirely. 
(uintptr_t)addr1 % 2 == 0 
so it could be padding, but it could be a short ( 2 bytes ) or 2(chars) but it couldn't be for example another integer or 32 bit value 


I don't understand what type (uintptr_t) is 
I've seen the formula address % N == 0 before but not sure how this formula works in relation to alignment. 
"alignment" means that the address of an object is a multiple of an integer 