为什么 gcc 忽略“无符号”数据类型语句?

问题描述 投票:0回答:1

用于测试我的函数的数字之一需要 64 位来存储,并且由于我使用 C 进行编码,所以我需要一个 unsigned long long 来存储这样的数字。当我尝试使用该数据类型定义变量并为其分配数字时,gcc 会告诉我“整数常量太大,以至于它是无符号的”,即使我已经指定了它。

编辑:通过在整数末尾添加

ULL
来删除警告。

我尝试了调试,除了数字需要 64 位的情况外,我的函数中的所有内容都有效。 在我的函数中,有时我需要反转有问题的数字。为此,我创建了一个名为 returned 的新变量,并使用数据类型 unsigned long long。

unsigned long long num = 18446744073709551615ULL;

...

unsigned long long reversed = 0, i;
for(i = num; i > 0; i /= 10) {
    reversed *= 10;
    reversed += i % 10;
}

通过调试器,我观察了该过程,并且变量

reversed
在 for 的最后一个周期乘以 10 时发生溢出。 我尝试将“unsigned long long”更改为“unsigned long long int”,但没有任何改变。我还尝试将用于加法和乘法的每个其他数字转换为 unsigned long long 但这不起作用。

抱歉缺少信息

c integer-overflow unsigned-long-long-int
1个回答
0
投票

当我尝试使用该数据类型定义变量并为其分配数字时,gcc 会告诉我“整数常量太大,以至于它是无符号的”,即使我已经指定了它。

您没有指定整数常量是无符号的。

unsigned long long num = 18446744073709551615;
指定
num
无符号。

18446744073709551615
是整数常量。它将被分配给
num
的事实并不使它具有
num
的属性。它只是一个整数常量,没有指示它是否应该是无符号的。

C 自动将类型分配给整型常量。对于没有后缀的十进制常数,通常使用值适合的

int
long int
long long int
中的第一个。您的值 18,446,744,073,709,551,615 不适合任何这些类型。从技术上讲,它属于 C 标准中的一个奇怪的类别:“如果一个整数常量不能用其列表中的任何类型表示并且没有扩展整数类型,那么该整数常量就没有类型。” (C 2018 6.4.4.1 6.) 编译器选择给它类型
unsigned long long int
并警告您此问题。

添加

ull
后缀可以修复此问题,因为它表示值适合的类型为
unsigned long long int
。只需添加
u
也可以,因为自动考虑的类型包括
unsigned long long int

© www.soinside.com 2019 - 2024. All rights reserved.