0LL或0x0UL是什么意思?

时间:2011-08-12 05:48:21

标签: c constants

我正在阅读Google Go tutorial,并在常量部分看到了这一点:

  

没有像0LL或0x0UL

这样的常量

我尝试进行谷歌搜索,但所有出现的情况都是人们使用这些常数的例子,但没有解释他们的意思。 0x应该启动十六进制文字,但这些不是十六进制数字中可能出现的字符。

5 个答案:

答案 0 :(得分:26)

这些是C和C ++中的常量。后缀LL表示常量的类型为long longUL表示unsigned long

通常,每个Ll代表long,每个Uu代表unsigned。所以,例如。

1uLL

表示类型为unsigned long long的常量1。

这也适用于浮点数:

1.0f    // of type 'float'
1.0     // of type 'double'
1.0L    // of type 'long double'

和字符串和字符,但它们是前缀:

 'A'   // of type 'char'
L'A'   // of type 'wchar_t'
u'A'   // of type 'char16_t' (C++0x only)
U'A'   // of type 'char32_t' (C++0x only)

在C和C ++中,整数常量使用其原始类型进行计算,这可能会因整数溢出而导致错误:

long long nanosec_wrong = 1000000000 * 600;
// ^ you'll get '-1295421440' since the constants are of type 'int'
//   which is usually only 32-bit long, not big enough to hold the result.

long long nanosec_correct = 1000000000LL * 600
// ^ you'll correctly get '600000000000' with this

int secs = 600;
long long nanosec_2 = 1000000000LL * secs;
// ^ use the '1000000000LL' to ensure the multiplication is done as 'long long's.

在Google Go中,所有整数都被评估为大整数(不会发生截断),

    var nanosec_correct int64 = 1000000000 * 600

并且没有“usual arithmetic promotion

    var b int32 = 600
    var a int64 = 1000000000 * b
    // ^ cannot use 1000000000 * b (type int32) as type int64 in assignment

所以后缀不是必需的。

答案 1 :(得分:6)

有几种不同的基本数字类型,字母区分它们:

0   // normal number is interpreted as int
0L  // ending with 'L' makes it a long
0LL // ending with 'LL' makes it long long
0UL // unsigned long

0.0  // decimal point makes it a double
0.0f // 'f' makes it a float

答案 2 :(得分:3)

0LL是一个很长的零。

0x0UL是无符号长零,用十六进制表示法表示。 0x0UL == 0UL

答案 3 :(得分:3)

LL将文字指定为long long,将UL指定为unsigned long,将0x0指定为0的十六进制。所以0LL0x0UL是等价的数字但不同的数据类型;前者是long long,后者是unsigned long

这些说明符有很多:

1F // float
1L // long
1ull // unsigned long long
1.0 // double

答案 4 :(得分:2)

+在类C语言中,这些后缀会告诉您确切的类型。所以,例如。 9是int变量,但0LLlong long