Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do I mute this error : "integer literal is too large to be represented in a signed integer type"

Tags:

c

binary

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 ?

like image 299
M. Kejji Avatar asked Feb 01 '16 17:02

M. Kejji


3 Answers

Implicitly, the integer literal is signed and of course the values are too big for a signed long long, so you need to let the compiler know that they have type unsigned, like this

mask_left = 9259542123273814143U;
mask_top = 18374686479671623680U;
like image 79
Iharob Al Asimi Avatar answered Nov 14 '22 09:11

Iharob Al Asimi


Rewrite it with explicit size:

mask_left = 9259542123273814144uLL;
mask_top = 18374686479671623680uLL;

By writing it as (unsigned long long) 9259542123273814144 it means to take the integer and then cast it longer. Unfortunately, the integer is probably munged (by throwing away the higher bits to make it an int) and then increasing the size.

like image 44
wallyk Avatar answered Nov 14 '22 09:11

wallyk


Signed integer literals cannot be larger than 2147483648. For a number larger than that, you need to add the LL prefix, which tells the compiler it is a long long. In your case, you want ULL as that designates an unsigned long long, which is what you're assigning to.

like image 39
dbush Avatar answered Nov 14 '22 10:11

dbush