3 ms·
#include <stdio.h> unsigned int pack_rgb(unsigned char r, unsigned char g, unsigned char b) { return (r << 16) | (g << 8) | b; } unsigned
by pjmlp 6mo ago
#include <stdio.h>
unsigned int pack_rgb(unsigned char r, unsigned char g, unsigned char b) {
return (r << 16) | (g << 8) | b;
}
unsigned int pack_rgb_arith(unsigned char r, unsigned char g, unsigned char b) {
return (r * 65536) + (g * 256) + b;
}
int main(void)
{
printf("The color value of (246, 176, 223) is %d\n", pack_rgb(246, 176, 223));
printf("The color value of (246, 176, 223) is %d\n", pack_rgb_arith(246, 176, 223));
}
Compiler Explorer link, https://godbolt.org/z/3jExdaTT9 https://godbolt.org/z/3jExdaTT9
I would expect a better comment from someone working on the standard.
- uecker 6mo agoYou should know that the type is promoted to int first, which is also what makes your example work. This is what happens when you perform the computation using an non-promoting 8 bit unsigned type: https://godbolt.org/z/fxxva4nWq https://godbolt.org/z/fxxva4nWq
- 3836293648 6mo agoDon't they get promoted to short?