2012-01-10 34 views
48

tôi đã chạy ngang qua một số mã như thế này:ULL hậu tố vào một số chữ

line += addr & 0x3fULL; 

Rõ ràng, 'U' và 'L' không hex chữ số. Tôi đoán rằng 'ULL' ở cuối chữ số hex đó có nghĩa là "Unsigned Long Long" - tôi có đúng không? (loại điều này là rất khó khăn để google) nếu như vậy thì đây là một số loại sửa đổi hậu tố về số lượng?

+0

C: [N1570] (http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf) 6.4.4.1. C++: [N4700] (http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2017/n4700.pdf) 5.13.2 [lex.icon]. Trong cả hai ngôn ngữ, hậu tố phân biệt chữ hoa chữ thường (ngoại trừ 'lL' và' Ll' không được phép) và 'LL' và' U' được chỉ định riêng biệt, vì vậy bạn có thể có bất kỳ 'ull',' uLL' , 'Ull',' ULL', 'llu',' llU', 'LLu',' LLU'. –

Trả lời

48

Từ gccmanual:

ISO C99 hỗ trợ các kiểu dữ liệu cho các số nguyên có ít nhất 64 bit rộng, và như một GCC mở rộng hỗ trợ họ trong chế độ C90 và trong C++. Chỉ cần viết long long int cho số nguyên đã ký hoặc unsigned long long int cho số nguyên không dấu. Để tạo hằng số nguyên của loại long long int, hãy thêm hậu tố LL vào số nguyên. Để tạo hằng số nguyên của loại unsigned long long int, hãy thêm hậu tố ULL vào số nguyên.

+2

Hướng dẫn GCC là một chút lỗi thời: chúng không còn là phần mở rộng C++. – MSalters

+0

@MSalters Tôi nghĩ rằng đó vẫn là hợp lệ trước C++ 11, phải không? Có lẽ câu trả lời chung lý tưởng hơn sẽ là từ tiêu chuẩn C++ 11 mặc dù: https://stackoverflow.com/a/34931381/2642059 –

+1

@JonathanMee: Trong C++ 98 chúng thực sự là phần mở rộng. Nhưng sự đồng thuận StackOverflow là trừ khi có quy định khác, các phiên bản hiện tại của phần mềm và tiêu chuẩn được giả định. I E. đó là C++ 14, C++ 17. – MSalters

21

Đúng vậy.

  • 0x tiền tố biến nó thành chữ thập lục phân.
  • ULL hậu tố làm cho nó nhập unsigned long long.
+0

Tôi cho rằng nó làm cho loại * ít nhất * đó, nhưng vì đây là loại có sẵn lớn nhất, có lẽ đó là điều tương tự. –

+0

Bạn nói đúng. Tôi chỉ thử nghiệm nó với 'long long x = 0xfffffffffffful;' trên Windows và nó không cắt ngắn - không có cảnh báo. – Mysticial

+0

Tất cả các chữ chỉ xác định chiều rộng mong muốn * tối thiểu *, với số tối thiểu tuyệt đối là 'int'. Nhưng bất kỳ chữ nào có một loại hỗ trợ nó, nếu có ... –

8

Tôi đang đặt câu trả lời mới vì tôi nhận ra rằng các câu trả lời hiện tại không trích dẫn từ nguồn nền tảng chéo. Tiêu chuẩn C++ 11 dictates rằng một chữ với U/uLL/ll hậu tố là một chữ kiểu: unsigned long long int [source]

U/u là C/C++ hậu tố cho một số nguyên unsigned.
LL/ll là hậu tố C/C++ cho số long long là số new type in C++11 và yêu cầu phải có độ dài ít nhất 64 bit.

Ghi chú:

  1. Từ khóa int có thể được bỏ qua nếu có bổ được sử dụng, ví dụ unsigned long long. Vì vậy, đây sẽ xác định one như một unsigned long long int, và bất kỳ số được gán cho nó sẽ static_cast để unsigned long long int: unsigned long long one = 1;
  2. C++ 11 đánh dấu sự ra đời của auto. Trong đó đặt loại biến thành loại được gán cho nó khi khai báo. Ví dụ: vì 2ULLunsigned long long int chữ số two sẽ được định nghĩa là unsigned long long int: auto two = 2ULL;
  3. C++ 14 giới thiệu các hậu tố chữ độc lập theo thứ tự. Trước đây, hậu tố U/u phải đứng trước bất kỳ hậu tố kích thước nào. Nhưng khoảng C++ 14 hậu tố được chấp nhận theo một trong hai thứ tự, vì vậy giờ đây là một số literal 13LLU hợp pháp.
+1

Bởi vì tâm trí của tôi hoạt động theo cách đó (nhưng tôi không có C++ 14 để tay): Tôi đoán C++ 14 không cho phép '13LUL'? – TripeHound

+0

@TripeHound http://ideone.com có ​​C++ 14 và nó không cho phép hậu tố LUL: http://ideone.com/AWmW8H Điều này dường như phù hợp với mục đích của: http://en.cppreference.com/w/cpp/language/integer_literal # Giải thích –

Các vấn đề liên quan