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
的最小保证位宽度为16,因此,如果您在unsigned int
s为16位的平台上,int
很可能是0xffffff
unsigned long
也可以是0xFFFFFF
(如注释中所指出的),也就是说,如果可以使用int
类型来表示它(例如,int
为64位的平台),它甚至不能保证是无符号的int
- 在表达式前面添加括号中的类型是类型转换操作,它强制将常量转换为括号中指示的类型。因此,强制转换的结果
将具有类型(long)0xffffffff
,但该值取决于各种因素,如标准所述:long
对于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