我在C中有这个学校作业,我将用以下标志更正:
-Wall -Wextra -Werror
Run Code Online (Sandbox Code Playgroud)
因此,这种无害的警告会成为错误并阻止编译:
integer literal is too large to be represented in a signed integer type
Run Code Online (Sandbox Code Playgroud)
(代码仍然有效)但如果我不能将其静音,我的工作将被视为错误
这是我的代码:
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);
}
Run Code Online (Sandbox Code Playgroud)
我在这里想要实现的是将无符号短(表示4x4方形的形状)转换为无符号长长,表示8x8方形中具有左上角形状的相同形状.它完美无缺,根据我的期望,我只需要避免发出警告.我以前使用(通常是等效的)二进制表达式而没有得到任何警告
0b1111111100000000000000000000000000000000000000000000000000000000
Run Code Online (Sandbox Code Playgroud)
和
0b1000000010000000100000001000000010000000100000001000000010000000
Run Code Online (Sandbox Code Playgroud)
问题是0bxxxx表单不是标准C(正如我在此StackOverflow中所读到的那样),因此我不允许使用它.
我也试过了
mask_left = (unsigned long long)9259542123273814144;
mask_top = (unsigned long long)18374686479671623680;
Run Code Online (Sandbox Code Playgroud)
编译器仍然告诉我,该值太大而无法在有符号整数类型中表示.我究竟做错了什么 ?有没有办法解决这个问题?
Iha*_*imi 14
隐含地,整数文字signed当然是值太大了signed long long,所以你需要让编译器知道它们有类型unsigned,就像这样
mask_left = 9259542123273814143U;
mask_top = 18374686479671623680U;
Run Code Online (Sandbox Code Playgroud)
用明确的大小重写它:
mask_left = 9259542123273814144uLL;
mask_top = 18374686479671623680uLL;
Run Code Online (Sandbox Code Playgroud)
通过编写它(unsigned long long) 9259542123273814144意味着取整数然后再投射它.不幸的是,整数可能是通过(通过丢弃更高的位使其成为一个int)然后增加大小.