数字文字的ULL后缀


74

我遇到过这样的一些代码:

line += addr & 0x3fULL;

显然,“ U”和“ L”不是十六进制数字。我猜测十六进制数字文字末尾的“ ULL”表示“ Unsigned Long Long”-我正确吗?(这种事情很难用谷歌搜索)如果是的话,那么这是数字上的某种后缀修饰符吗?


3
C:N1570 6.4.4.1。C ++:N4700 5.13.2 [lex.icon]。在这两种语言,后缀是不区分大小写的(不同之处在于lLLl不允许),并且LLU被分别指定,所以可以有任何的ulluLLUllULLllullULLuLLU
Keith Thompson

平@TonyTannous。
jww

这回答了你的问题了吗?0LL或0x0UL是什么意思?
phuclv

Answers:


71

gcc 手册

ISO C99支持至少64位宽(...)的整数的数据类型。要使type为整数常量long long int,请将后缀添加LL到整数。要使type为整数常量unsigned long long int,请将后缀添加ULL到整数。

这些后缀也已添加到C ++ 11中的C ++中,并且在此之前作为编译器扩展已经得到了长期支持(双关语意)。


2
GCC手册有点过时了:它们不再是C ++扩展。
MSalters '16

1
@MSalters我认为在C ++ 11之前仍然有效,对吗?也许更理想的一般答案是来自C ++ 11标准:stackoverflow.com/a/34931381/2642059
Jonathan Mee

1
@JonathanMee:在C ++ 98中,它们确实是扩展。但是,StackOverflow的共识是,除非另有说明,否则均假定使用软件和标准的当前版本。也就是说,现在是C ++ 14,很快就会是C ++ 17。
MSalters

30

对,那是正确的。

  • 0x 前缀使它成为十六进制文字。
  • ULL后缀使其输入unsigned long long

我想它至少使该类型成为可能,但是由于它是最大的可用类型,因此可能是同一回事。
Kerrek SB 2012年

你是对的。我只是long long x = 0xfffffffffffful;在Windows上进行了测试,并且不会截断-也没有警告。
Mysticial 2012年

所有文字仅指定所需的最小宽度,绝对最小值为int。但是任何文字都有支持它的类型,如果有的话……
Kerrek SB 2012年

14

我提出了一个新的答案,因为我认识到当前的答案并非来自跨平台来源。标准规定文字与U/uLL/ll后缀是一种类型的文字:unsigned long long int []

U/u是无符号整数的C / C ++后缀。
LL/lllong long整数的C / C ++后缀,它是C ++ 11中新类型,并且必须具有至少64位的长度。

笔记:

  1. 例如int,如果使用任何修饰符,则可以省略关键字unsigned long long。因此,这将定义oneunsigned long long int,并分配给它的任何数量将static_castunsigned long long intunsigned long long one = 1
  2. 标志着的到来auto。它将变量类型设置为声明时分配给它的类型。例如,因为2ULLunsigned long long int文字two将被定义为unsigned long long intauto two = 2ULL
  3. 引入了与顺序无关的文字后缀。以前,U/u后缀必须在任何大小的后缀之前。但是大约后缀以任意顺序接受,因此,因为3LLU是,unsigned long long int立即数three将被定义为unsigned long long intauto three = 3LLU

2
因为我的想法是这样工作的(但是我没有C ++ 14):我认为C ++ 14不允许13LUL吗?
TripeHound

@TripeHound ideone.com具有C ++ 14,它不允许使用LUL后缀:ideone.com/AWmW8H这似乎与以下目的相符:en.cppreference.com/w/cpp/language/integer_literal#Explanation
Jonathan Mee
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.