【发布时间】: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
9259542123273814144和9259542123273814144L作为尝试的无后缀十进制整数常量,都超过了LLONG_MAX并且不适合。注意:C 没有指定整数文字。它确实指定了整数辅音。