Là 0 một chữ thập phân hay một bát phân?


329

Số không luôn luôn là số không, vì vậy nó không thành vấn đề. Nhưng trong một cuộc thảo luận gần đây với một người bạn, ông nói rằng những chữ bát phân gần như không được sử dụng ngày nay. Sau đó, nó nhớ ra thực sự gần như tất cả các chữ số nguyên trong mã của tôi bát phân, cụ thể là 0.

0một bát phân theo ngữ pháp C ++? Tiêu chuẩn nói gì?

Use Việc sử dụng thực sự duy nhất mà tôi biết là dành cho các quyền của tập tin unix.


6
Điều này có giống với Java không?
Philippe

80
+1 để hỏi một câu hỏi hoàn toàn không liên quan và nhận hàng tấn
upvote

63
Tôi nghĩ rằng cách để đại diện tức thì trên SO không phải là một câu hỏi sâu sắc, mà là một câu hỏi kỳ quặc mà câu trả lời của bạn sẽ khiến bạn tin tưởng vào máy làm mát nước :)
Josh

4
Câu hỏi khủng khiếp :) Tôi đã tra cứu nó trong Đặc tả ngôn ngữ Java và trong Java nó là số thập phân. Thông số kỹ thuật thậm chí có chứa trích dẫn sau: Lưu ý rằng các số bát phân luôn bao gồm hai hoặc nhiều chữ số; 0 luôn được coi là một số thập phân - không phải là vấn đề quan trọng trong thực tế, đối với các chữ số 0, 00 và 0x0 đều biểu thị chính xác cùng một giá trị số nguyên.
Tobias Ritzau

14
Tôi gần như bị cám dỗ để gửi một câu trả lời rằng "Có, 0 là một chữ thập phân hoặc một chữ bát phân".
Keith Thompson

Câu trả lời:


296

Vâng, 0là một chữ Octal trong C ++.

Theo tiêu chuẩn C ++:

2.14.2 Số nguyên chữ [lex.icon]

integer-literal:  
    decimal-literal integer-suffixopt  
    octal-literal integer-suffixopt  
    hexadecimal-literal integer-suffixopt  
decimal-literal:  
    nonzero-digit  
    decimal-literal digit  
octal-literal:  
    0                           <--------------------<Here>
    octal-literal octal-digit

39
Vấn đề quan trọng khác là có một chữ số thập phân-đen là một nonzero chữ số tiếp theo không hoặc nhiều chữ số như vậy không có sự mơ hồ.
CB Bailey

3
@MSalters: Với phiên bản của bạn, bạn phải bổ sung chỉ định tùy chọn: Nếu cả hai octal-literaldecimal-literalcó thể diễn giải mẫu byte, hãy chọn octal-literal. Từ ngữ của tiêu chuẩn chính thức không có vấn đề này.
Martin Sojka

23
@MSalters: Bạn vẫn không thể có chữ số thập phân là bất kỳ số chữ số nào, nó sẽ phải là một chữ số 0 hoặc một chữ số không theo sau bởi bất kỳ chữ số nào nếu không mọi chữ số bát phân có thể được hiểu là một chữ số thập phân. Tôi có thể thấy lỗi biên dịch, bây giờ : ERROR: 0 is ambiguous, could be octal zero or could be decimal zero. Consider using (1 - 1) to disambiguate.
CB Bailey

3
@MSalters Trong ví dụ của bạn, 0123 sẽ khớp cả chữ bát phân và chữ thập phân, nhưng sẽ có ý nghĩa khác nhau.
fluffy

5
@CharlesBailey - FTFY, 1vẫn còn là bát phân và tất cả; P -ERROR: 0 is ambiguous, could be octal zero or could be decimal zero. Consider using (8 - 8) to disambiguate
twalberg

44

Bất kỳ giá trị số nguyên nào có tiền tố 0là một giá trị bát phân. Tức là: 01 là bát phân 1, 010 là bát phân 10, là số thập phân 8 và 0 là số bát phân 0 (là số thập phân và bất kỳ số nào khác, 0).

Vì vậy, có, '0' là một bát phân.

Đó là bản dịch tiếng Anh đơn giản của đoạn ngữ pháp trong câu trả lời của @ Als :-)


Một số nguyên có tiền tố không phải0x là tiền tố . là một tiền tố rõ ràng khác nhau. Rõ ràng có những người không thể tạo ra sự khác biệt này.00x

Theo tiêu chuẩn tương tự, nếu chúng ta tiếp tục:

 integer-literal:
     decimal-literal integer-suffixopt
     octal-literal integer-suffixopt
     hexadecimal-literal integer-suffixopt
 decimal-literal:
     nonzero-digit                       <<<---- That's the case of no prefix.
     decimal-literal digit-separatoropt digit
 octal-literal:
     0                                    <<<---- '0' prefix defined here.
     octal-literal digit-separatoropt octal-digit <<<---- No 'x' or 'X' is
                                                          allowed here.
 hexadecimal-literal:
     0x hexadecimal-digit                 <<<---- '0x' prefix defined here
     0X hexadecimal-digit                 <<<---- And here.
     hexadecimal-literal digit-separatoropt hexadecimal-digit

5
"Bất kỳ giá trị số nguyên nào bắt đầu bằng '0' là giá trị bát phân." Không đúng. Ví dụ: 0xA bắt đầu bằng '0' và là một giá trị nguyên.
Nikolai Ruhe

4
0xkhông phải là mã thông báo. Một số nguyên bắt đầu bằng 0xlà một mã thông báo duy nhất.
Keith Thompson

4
Nguồn nào bạn trích dẫn cho định nghĩa đó? Từ "mã thông báo" được định nghĩa cú pháp theo tiêu chuẩn C (N1570 6.4) và C ++ (C ++ 11 2.7 [lex.token]). 0xkhông đủ điều kiện. (Ít nhất là trong C, đó là số tiền xử lý (N1570 6.4.8) nếu đó không phải là một phần của hằng số thập lục phân, nhưng đó không phải là mã thông báo.)
Keith Thompson

11
Chúng tôi đang thảo luận về cú pháp của hằng số nguyên / chữ theo định nghĩa của các tiêu chuẩn C và C ++ . Làm thế nào để định nghĩa "mã thông báo" của các tiêu chuẩn không phải là cách thích hợp nhất để sử dụng trong ngữ cảnh này? Sự ủy khuất của bạn là không phù hợp. Và nếu bạn nghĩ tôi là kẻ bắt nạt khi chỉ ra điều gì đó mà tôi nghĩ là lỗi kỹ thuật trong câu trả lời của bạn, tôi khuyên bạn nên xem xét lại ý nghĩa của từ đó. (Bạn chưa bao giờ trả lời câu hỏi của tôi về nguồn gốc định nghĩa của bạn.)
Keith Thompson

4
Nếu bất kỳ ai cũng tò mò, tuyên bố rằng " Mã thông báo là một chuỗi gồm một hoặc nhiều ký tự có ý nghĩa như một nhóm. " Dường như là từ bài viết Wikipedia này .
Keith Thompson

-2

Rõ ràng tất cả các chữ nguyên bắt đầu bằng 0 trong thực tế là bát phân. Điều này có nghĩa là nó bao gồm 0 là tốt. Điều này làm cho sự khác biệt nhỏ vì số không là số không. Nhưng không biết sự thật này có thể làm tổn thương bạn.

Tôi nhận ra điều này khi tôi đang cố gắng viết một chương trình để chuyển đổi số nhị phân thành đầu ra thập phân và thập lục phân. Mỗi lần tôi đưa ra một số bắt đầu bằng 0 tôi lại nhận được đầu ra sai (Ví dụ: 012 = 10, không phải 12).

Thật tốt khi biết thông tin này để bạn không mắc phải sai lầm tương tự.


7
Các số nguyên bắt đầu bằng 0 nhưng không có 'x' sau số 0.
luiscubal

5
Một khẳng định "có" mà không có bằng chứng cũng không phải là một câu trả lời.
Các cuộc đua nhẹ nhàng trong quỹ đạo

1
Theo logic này, 09 là một số bát phân.
0xc0de

3
@ 0xc0de: Không, 09không phải là số bát phân, vì nó hoàn toàn không phải là số; nó không khớp với cú pháp cho bất kỳ loại số nguyên nào.
Keith Thompson

7
Tôi khá tự tin rằng @ 0xc0de biết rằng đó 09không phải là số bát phân. Điều được nói là " Theo logic này , 09là một số bát phân." Ý nói, vì 09không một số bát phân, logic phải là sai.
TRiG
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.