首页 > 解决方案 > C 编译器无法识别 unsigned long

问题描述

在我的电脑上,long最大值为9223372036854775807. 但是,当我厌倦unsigned long了更大的值时,编译器会抛出一个警告,说它需要被解释为unsigned long当我已经将它定义为时。为什么会这样?

//assigning maximum value of a long integer. (No error)
long max_l = 9223372036854775807L;

//assigning an unsigned long integer.
unsigned long max_ul = 9223372036854775808L; //warning: integer literal is too large to be represented in a signed
                                             //integer type, interpreting as unsigned [-Wimplicitly-unsigned-literal]

cc --version
Apple LLVM version 10.0.1 (clang-1001.0.46.4)

标签: clong-integerimplicit-conversionunsignedunsigned-integer

解决方案


这个整数常量:

9223372036854775808L

太大而无法存储在long.

相反,使用:

9223372036854775808UL

unsigned long这通过附加后缀来指定常量具有类型UL

或者只使用后缀U

unsigned long max_ul = 9223372036854775808U;

当整数常量具有后缀L(或l)时,编译器按以下顺序确定其类型:类型中的第一个

signed long
signed long long

在其中可以表示它的价值。该类型似乎与编译器建立的类型signed long具有相同的整数表示。signed long long所以类型signed long和类型signed long long都不能代表常量。常数对于这些类型来说太大了。但是与编译器建立的类型unsigned long具有相同内部表示的类型可以表示常量。unsigned long long

还要注意 C 中没有负整数常量。例如,如果您将编写

int x = -1;

然后编译器将构造拆分-1为两个标记:整数常量1和一元运算符-

考虑以下演示程序

#include <stdio.h>

int main(void) 
{
    int a[] = { 0, 1, 2 };
    int *p = a + 1;

    printf( "p[-1] = %d\n", p[-1] );
    printf( "-1[p] = %d\n", -1[p] );

    return 0;
}

程序输出为

p[-1] = 0
-1[p] = -2

表达式-1[p]与表达式不同(-1)[p]。它被处理为-(1[p] )等价于-p[1]


推荐阅读