5

举个例子,0xffffffffL.

假设 int 是 32 位,0xffffffffL(long)0xffffffff? 换句话说,是0xffffffffLlong的类型吗?

由于类型0xffffffffunsigned int,我认为那0xffffffffLunsigned long而不是signed long,尽管我不确定。

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

4

2 回答 2

6

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

6.4.4.1 整数常量

[...]

描述

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

[...]

语义

整数常量的类型是可以表示其值的对应列表中的第一个。

[...]

后缀 十进制常数 八进制或十六进制常数
-------------------------------------------------- ----------------------
无 int int
                   long int 无符号整数
                   long long int long int
                                             无符号长整数
                                             长长整数
                                             unsigned long long int
-------------------------------------------------- ----------------------
[...]
-------------------------------------------------- ----------------------
l 或 L long int long int
                   long long int 无符号 long int
                                             长长整数
                                             unsigned long long int

[...]

如果一个整数常量不能用它的列表中的任何类型表示,它可能有一个扩展的整数类型,如果扩展的整数类型可以表示它的值。如果常量列表中的所有类型都带符号,则扩展整数类型应带符号。如果常量列表中的所有类型都是无符号的,则扩展整数类型应该是无符号的。如果列表同时包含有符号和无符号类型,则扩展整数类型可能是有符号或无符号的。如果整数常量不能用其列表中的任何类型表示并且没有扩展整数类型,则整数常量没有类型。

因此,根据上述引文:

  • 常量的类型或大小都不0xffffffffL是由后缀唯一标识的。它还取决于 a 的实际位宽long,这是由实现定义的(至少为 32 位)。

  • 0xffffffff不保证是unsigned intunsigned int最小保证位宽为 16,因此如果您在ints 为 16 位的平台上,0xffffffff很可能是unsigned long. 0xffffffff也可以是一个int(如评论中所指出的),即如果int可以使用类型来表示它(例如,int64 位的平台),它甚至不能保证是无符号的。

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

6.3 转换

[...]

6.3.1.3 有符号和无符号整数

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

否则,如果新类型是无符号的,则通过在新类型中可以表示的最大值的基础上反复加减一,直到该值在新类型的范围内。

否则,新类型是有符号的,值不能在其中表示;结果是实现定义的,或者引发了实现定义的信号。

于 2013-09-14T09:37:41.767 回答
4

带后缀的L十六进制常量将具有第一种可以保存该值的类型,即long, unsigned long, long long, unsigned long long。它完全独立于无后缀常量是否会被签名。

在您考虑的两种情况下(32 位 int,32 位或 64 位长),在两个系统上0xffffffff都有类型。将具有32 位长和64 位长的类型。unsigned0xffffffffLunsigned longlong

所以不,0xffffffffL不一样(long)0xffffffff。后者总是有 type long,不管范围long是什么。评估时,如果该值不适合long,您将无法获得您指定的值。会发生什么取决于实施。在实践中,您可能会得到 -1,但不能保证。

于 2013-09-14T09:32:26.607 回答