如何将此错误静音:“整数文字太大而无法以有符号整数类型表示”

时间:2016-02-01 17:05:17

标签: c binary

我在C学校有这个学校作业,我将用以下标志更正:

-Wall -Wextra -Werror

因此,这种无害的警告会成为错误并阻止编译:

integer literal is too large to be represented in a signed integer type

(代码仍然有效)但如果我不能将其静音,我的工作将被视为错误

这是我的代码:

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);
}

我在这里想要实现的是将无符号短(表示4x4方形的形状)转换为无符号长长,表示8x8方形中具有左上角形状的相同形状。它完美无缺,根据我的期望,我只需要避免发出警告。我之前使用的是(通常是等效的)二进制表达式而没有得到任何警告

0b1111111100000000000000000000000000000000000000000000000000000000

0b1000000010000000100000001000000010000000100000001000000010000000

问题是0bxxxx表格不是标准C(正如我读in this StackOverflow answer),因此我不允许使用它。

我也试过

mask_left = (unsigned long long)9259542123273814144;
mask_top = (unsigned long long)18374686479671623680;

编译器仍然告诉我该值太大而无法在签名整数类型中表示。我究竟做错了什么 ?有没有办法解决这个问题?

3 个答案:

答案 0 :(得分:13)

隐式地,整数文字是signed,当然这些值对于signed long long来说太大了,所以你需要让编译器知道它们的类型为unsigned,就像这样

mask_left = 9259542123273814143U;
mask_top = 18374686479671623680U;

答案 1 :(得分:6)

使用显式大小重写它:

mask_left = 9259542123273814144uLL;
mask_top = 18374686479671623680uLL;

通过将其写为(unsigned long long) 9259542123273814144,它意味着获取整数,然后再将其投射更长时间。不幸的是,整数可能是通过(通过丢弃更高的位使其成为int)然后增加大小。

答案 2 :(得分:2)

有符号整数文字不能大于2147483648.对于大于该数字的数字,您需要添加LL前缀,该前缀告诉编译器它是long long。在您的情况下,您希望ULL指定unsigned long long,这是您要分配的内容。