C 数字后面的后缀L是否总是与括号中的“L”具有相同的效果;“长”;在它前面的数字?

C 数字后面的后缀L是否总是与括号中的“L”具有相同的效果;“长”;在它前面的数字?,c,type-conversion,C,Type Conversion,例如,0xffffffffffl 假设int是32位,那么0xffffffffff是否与(长)0xffffffff相同?换句话说,0xffffffffffl的类型是否很长 由于0xffffff的类型是unsigned int,我认为0xffffffff是unsigned long而不是signed long,尽管我不确定 这是否取决于long是32位还是64位?一个L-后缀十六进制常量将具有第一种可以保存该值的类型,即long,无符号长,长,无符号长。它完全独立于无固定常数是否有符号 在您考虑的

例如,
0xffffffffffl

假设int是32位,那么
0xffffffffff
是否与
(长)0xffffffff
相同?换句话说,
0xffffffffffl
的类型是否很长

由于
0xffffff
的类型是
unsigned int
,我认为
0xffffffff
unsigned long
而不是
signed long
,尽管我不确定


这是否取决于
long
是32位还是64位?

一个
L
-后缀十六进制常量将具有第一种可以保存该值的类型,即
long
无符号长
无符号长
。它完全独立于无固定常数是否有符号

在您考虑的两种情况下(32位int,32位或64位长),
0xffffffff
在两个系统上都具有类型
无符号
0xFFFFFFFFFFL
对于32位长,将具有类型
无符号长
,对于64位长,将具有类型


因此,不,
0xffffffff
(long)0xffffffff
不同。后者始终具有类型
long
,无论
long
的范围是什么。计算时,如果值不适合
long
,则无法获得指定的值。会发生什么取决于实施情况。在实践中,您可能会得到-1,但这不是保证。

引用C99标准草案N1256(强调我的):

6.4.4.1整数常数 [……]

说明

整数常量以数字开头,但没有句点或指数部分。它可能有一个 指定其基的前缀和指定其类型的后缀

[……]

语义

整型常量的类型是可以表示其值的相应列表的第一个

[……]

后缀十进制常量八进制或十六进制常量 -------------------------------------------------------------------------- 无整数整数 长整型无符号整型 长整型长整型 无符号长整型 双长整型 无符号长长整型 -------------------------------------------------------------------------- [...] -------------------------------------------------------------------------- l或l长整型长整型 长整型无符号长整型 双长整型 无符号长长整型 [……]

如果整型常量不能由其列表中的任何类型表示,则它可能具有 扩展整数类型,如果扩展整数类型可以表示其值。如果所有的 常量列表中的类型是有符号的,扩展整数类型应该是有符号的。如果 常量列表中的所有类型都是无符号的,扩展整数类型应为 没有签名。如果列表同时包含有符号和无符号类型,则扩展整数类型 可以是已签名的或未签名的。如果整数常量不能由中的任何类型表示 它的列表没有扩展的整数类型,则整数常量没有类型

因此,根据上述引文:

  • 后缀不能唯一标识常量的类型或大小,例如
    0xffffffffL
    。它还取决于
    的实际位宽度,该宽度由实现定义(最小为32位)

  • 0xffffffff
    不保证为
    无符号int
    unsigned int
    的最小保证位宽度为16,因此,如果您在
    int
    s为16位的平台上,
    0xffffff
    很可能是
    unsigned long
    0xFFFFFF
    也可以是
    int
    (如注释中所指出的),也就是说,如果可以使用
    int
    类型来表示它(例如,
    int
    为64位的平台),它甚至不能保证是无符号的

  • 在表达式前面添加括号中的类型是类型转换操作,它强制将常量转换为括号中指示的类型。因此,强制转换的结果
    (long)0xffffffff
    将具有类型
    long
    ,但该值取决于各种因素,如标准所述:

6.3转换 [……]

6.3.1.3有符号和无符号整数

当整数类型的值转换为除_Bool以外的其他整数类型时,如果 该值可以由新类型表示,但保持不变

否则,如果新类型是无符号的,则通过重复添加或 比新类型中可以表示的最大值多减去一个 直到值在新类型的范围内

否则,新类型已签名,且无法在其中表示值;要么 结果是定义了实现或发出了定义了实现的信号


对于32位
长的
(long)0xFFFFFFFF
会发生什么?ID值/6.3.1.3 C99中的“信号升高”?UL后缀如何?UL后缀的十六进制常量将具有第一种可以保存该值的类型,无符号long,无符号long-long,不是吗?@xiaokaoy,这是正确的。此外,如果有任何无符号后缀,则常量是否为d不再重要 Suffix Decimal Constant Octal or Hexadecimal constant -------------------------------------------------------------------------- none int int long int unsigned int long long int long int unsigned long int long long int unsigned long long int -------------------------------------------------------------------------- [...] -------------------------------------------------------------------------- l or L long int long int long long int unsigned long int long long int unsigned long long int