I have this school assignment in C where I will be corrected with the following flags :
-Wall -Wextra -Werror
So this harmless warning becomes an error and prevents compilation :
integer literal is too large to be represented in a signed integer type
(code still works) but if I can't mute it my work will be considered wrong
Here is my code :
static unsigned long long   piece_to_map(unsigned short little)
{
    static unsigned short   row;
    unsigned long long      big;
    char                    i;
    unsigned long long      mask_left;
    unsigned long long      mask_top;
    mask_left = 9259542123273814144;
    mask_top = 18374686479671623680;
    row = 15;
    big = 0;
    i = 0;
    while (i < 16)
    {
        big |= (little & (row << i)) << i;
        i += 4;
    }
    while ((big & mask_t) == 0)
        big = big << 8;
    while ((big & mask_l) == 0)
        big = big << 1;
    return (big);
}
What I'm trying to achieve here is to transform an unsigned short (representing a shape in a 4x4 square) to an unsigned long long representing the same shape in a 8x8 square having the shape cornered top-left. It works perfectly and according to my expectations, I just need to avoid having the warning. I was formerly using the (normally equivalent) binary expression instead and didn't get any warning
0b1111111100000000000000000000000000000000000000000000000000000000
and
0b1000000010000000100000001000000010000000100000001000000010000000
The problem is that the 0bxxxx form is not standard C (As I read in this StackOverflow answer), therefore I am not allowed to use it.
I also tried
mask_left = (unsigned long long)9259542123273814144;
mask_top = (unsigned long long)18374686479671623680;
The compiler still tells me that the value is too large to be represened in a signed integer type. What am I doing wrong ? Is there any way to fix this at all ?