2010-04-18 43 views
6

Tôi có rất nhiều #define trong mã của tôi. Bây giờ một vấn đề lạ lùng đã tăng lên.Giá trị của C xác định thay đổi đột ngột

Tôi có điều này:

#define _ImmSign 010100 

(Tôi đang cố gắng để mô phỏng một số nhị phân)

Rõ ràng, tôi hy vọng con số này sẽ trở thành 10100. Nhưng khi tôi sử dụng số đó đã thay đổi vào 4160.

Điều gì đang xảy ra ở đây? Và làm thế nào để ngăn chặn nó?

BỔ SUNG

Được rồi, vì vậy đây là do ngôn ngữ giải thích điều này như một bát phân. Có một số cách thông minh tuy nhiên để buộc các ngôn ngữ để giải thích các con số như số nguyên? Nếu số 0 đầu tiên xác định bát phân và 0x xác định hệ thập lục phân ngay bây giờ mà tôi nghĩ về nó ...

+3

010100 trong bát phân là 0 * 1 + 0 * 8 + 1 * 64 + 0 * 512 + 1 * 4096 = 64 + 4096 = 4160. –

+0

http://www.boost.org/doc/libs/1_42_0/libs/utility/utility.htm#BOOST_BINARY Điều này có thể hữu ích cho bạn. mặc dù C++, tôi nghĩ rằng đó là preprocessor chỉ – Anycorn

+0

@aaa thx cho đề xuất này, nhưng tôi không nghĩ rằng tôi được phép sử dụng thư viện của bên thứ ba. – NomeN

Trả lời

1

Nếu bạn sẵn sàng để viết mã không cầm tay và sử dụng gcc, bạn có thể sử dụng binary constants extension:

#define _ImmSign 0b010100 
+1

argh ... Tôi đã tìm kiếm điều này một vài lần nhưng nó không bao giờ xuất hiện trong google. SO đá! – NomeN

13

Chữ số nguyên bắt đầu bằng số bát phân, không thập phân, giống như cách bắt đầu bằng số nguyên bắt đầu bằng 0x dưới dạng thập lục phân.

Xóa số 0 đứng đầu và bạn nên sử dụng tốt.

Cũng lưu ý rằng số nhận dạng bắt đầu bằng dấu gạch dưới theo sau là chữ cái viết hoa hoặc dấu gạch dưới khác được dành riêng cho việc triển khai, vì vậy bạn không nên xác định chúng trong mã của mình.

+0

câu trả lời nhanh! Có cách nào khác để ngăn chặn điều này sau đó loại bỏ các số không hàng đầu? – NomeN

+2

@NomeN: Không; đó là một phần cơ bản của ngôn ngữ. –

4

Tiền tố số nguyên bằng 0 làm cho số bát phân thay vì số thập phân và 010100 trong bát phân là 4160 theo số thập phân.

+0

trả lời nhanh khác, thx! Có cách nào khác để sửa lỗi này thay vì loại bỏ số 0 hàng đầu? – NomeN

+0

Không phải là tôi biết. – Maulrus

2

Không có cú pháp số nhị phân trong C, ít nhất là không có phần mở rộng trình biên dịch. Những gì bạn thấy là 010100 được hiểu là số bát phân (cơ sở 8): được thực hiện khi bắt đầu bằng chữ số bắt đầu bằng 0.

2

010100 được coi là bát phân bởi C vì hàng đầu 0. Octal 10100 là 4160.

0

Octal :-)

Bạn có thể tìm thấy these macros helpful để trình bày số nhị phân với số thập phân hoặc bát phân ở dạng số 1 và số 0. Họ xử lý số không đứng đầu, nhưng tiếc là bạn phải chọn tên macro chính xác tùy thuộc vào việc bạn có số 0 đứng đầu hay không. Không hoàn hảo, nhưng hy vọng hữu ích.

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