【问题标题】:How do I mute this error : "integer literal is too large to be represented in a signed integer type"如何消除此错误:“整数文字太大而无法以有符号整数类型表示”
【发布时间】:2016-05-10 05:43:58
【问题描述】:

我在 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;

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

【问题讨论】:

  • 这不是一个无害的警告。
  • 9259542123273814144 是整数文字,9259542123273814144L 是长整数文字。
  • 没有编译标志,它只是一个警告,编译成功。使用标志它是一个错误并且编译失败。这就是我所说的“无害”@tkausl 的意思:谢谢,我从来不知道这样的后缀
  • 这绝不是无害的:它是有符号整数类型的溢出,导致未定义的行为。该程序可能会引发新的世界大战或杀死一些小猫!
  • @tkausl 92595421232738141449259542123273814144L 作为尝试的无后缀十进制整数常量,都超过了 LLONG_MAX 并且不适合。注意:C 没有指定整数文字。它确实指定了整数辅音

标签: c binary


【解决方案1】:

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

mask_left = 9259542123273814143U;
mask_top = 18374686479671623680U;

【讨论】:

  • 我从未听说过这样的后缀 :D 谢谢!这正是我试图通过在第二次尝试中使用 litteral 来实现的目标
  • "整数文字的类型为int"。编号decimal literals can be int, longlong long。问题是这两个常量都超过了LLONG_MAX9223372036854775807
  • 好多了。细节:无后缀十进制整数常量是有符号的。 OP 可以完成 mask_left = 0x8080808080808080; mask_top = 0xFF00000000000000; ,它是十六进制整数 constants 并且会根据需要悄悄地无符号。 IMO,OP 无论如何都应该使用十六进制 constants 作为掩码。
  • 谢谢 chux,我是二元运算、掩码、移位等方面的新手……我会在接下来的工作中注意这个建议
【解决方案2】:

用明确的大小重写它:

mask_left = 9259542123273814144uLL;
mask_top = 18374686479671623680uLL;

将其写成(unsigned long long) 9259542123273814144 意味着取整数,然后将其转换为更长的时间。不幸的是,整数可能会被修改(通过丢弃高位使其成为int)然后增加大小。

【讨论】:

  • 不需要“LL”。大小显式不是问题。问题是9259542123273814144 &gt; LLONG_MAX,因此编译器超出了 C 规范,发现值适合作为无符号文字。 (unsigned long long) 如此警告。
【解决方案3】:

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

【讨论】:

  • “有符号整数文字不能大于 2147483648”不正确。有符号整数文字不能大于 LLONG_MAX 至少为 9223372036854775807pow(2,63)-1
猜你喜欢
  • 2022-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-15
  • 2011-04-15
  • 2017-12-12
  • 1970-01-01
相关资源
最近更新 更多