2011-08-12 47 views
12

Tôi đọc Google Go tutorial và thấy điều này trong các hằng số phần:0LL hoặc 0x0UL có nghĩa là gì?

Không có hằng số như 0LL hoặc 0x0UL

Tôi cố gắng để thực hiện tìm kiếm Google nhưng tất cả những gì đi lên những trường hợp mà mọi người đang sử dụng các hằng số này nhưng không giải thích về ý nghĩa của chúng. 0x được cho là bắt đầu một chữ thập lục phân nhưng đây không phải là các ký tự có thể có trong một số thập lục phân.

+0

"Tôi đã cố gắng để thực hiện tìm kiếm Google" ... cố gắng tìm kiếm term 'integer constants C++ LL'. :) –

+0

Tôi luôn luôn nghĩ về những thứ như 'literals' và hằng số như các biến được khai báo là hằng số. –

+0

Công bằng đủ, nhưng tôi tưởng tượng kết quả cho 'số nguyên literals C++ LL' là tương tự ... :) –

Trả lời

20

Đây là các hằng số trong C và C++. Hậu tố LL có nghĩa là hằng số thuộc loại long longUL có nghĩa là unsigned long.

Nói chung, mỗi L hoặc l đại diện cho một long và mỗi U hoặc u đại diện cho một unsigned. Vì vậy, ví dụ:

1uLL 

là hằng số 1 có loại unsigned long long.

này cũng áp dụng cho số dấu chấm động:

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

và chuỗi và ký tự, nhưng họ là các tiền tố:

'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) 

Trong C và C++ các hằng số nguyên được đánh giá sử dụng của họ loại gốc, có thể gây ra lỗi do tràn số nguyên:

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. 

Trong Google Go, tất cả các số nguyên được đánh giá là số nguyên lớn (không bị cắt xén sẽ xảy ra),

var nanosec_correct int64 = 1000000000 * 600 

và không có "usual arithmetic promotion"

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

nên hậu tố không cần thiết.

2

0LL là số không dài.

0x0UL là số không dài không được ký hiệu, được biểu thị bằng ký hiệu thập lục phân. 0x0UL == 0UL.

2

LL chỉ định một chữ như một long longUL chỉ định một như unsigned long0x0 là hệ thập lục phân cho 0. Vì vậy, 0LL0x0UL là một số tương đương nhưng các kiểu dữ liệu khác nhau; trước đây là long long và cái sau là unsigned long.

Có rất nhiều các specifiers:

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

Không có thứ gì như' 1D' trong C hoặc C++. – kennytm

+0

@Kenny Oh, phải không? Liệu 'x.x' có phục vụ mục đích đó không? Cảm ơn vì thông tin, tôi cho rằng D là gấp đôi. –

+0

Có bạn đã đúng. – kennytm

2

+ Trong ngôn ngữ C-như, những hậu tố cho bạn biết chính xác loại. Ví dụ.9 là một biến int, nhưng 0LL là một long long

4

Có một số loại số cơ bản khác nhau, và các chữ cái phân biệt chúng:

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