2012-01-26 28 views
5

Tôi hiện đang bắt đầu với bộ điều khiển vi chương trình sử dụng C30 (Trình biên dịch A C dựa trên GCC từ vi mạch cho thiết bị PIC24) và tôi đã cho phép Strict ANSI warnings hết mức tò mò. Trước hết, tôi không biết rằng trong các đánh dấu bình luận C11 như // là "sai" và thay vào đó tôi nên sử dụng/* blah blah * /, nhưng điều thực sự làm tôi ngạc nhiên là cảnh báo này cho một dòng mã.Làm cách nào để sử dụng tiền tố nhị phân phù hợp với C11?

"cảnh báo: sử dụng tiền tố nhị phân phi tiêu chuẩn"

Các dòng mã là:

OSCCONbits.COSC = 0b000;

tôi đã xem xét trực tuyến tại một trong những dự thảo C11 (ISO/IEC 9899 : 2011) và không thể tìm thấy bất kỳ điều gì về tiền tố nhị phân trong C. http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf

Ký hiệu nhị phân chính xác cho C theo C11 là gì?

+1

Chuyển đổi nó vào một số thập lục phân. Đối với thiết lập một cái gì đó để (nhị phân) '0000' tại sao không chỉ sử dụng một số thập phân bình thường' 0' hoặc hệ thập lục phân '0x00'? –

+6

Ai đã nói với bạn // nhận xét là "sai"? –

+0

Tôi nghĩ rằng tôi có thể đã sai câu hỏi của tôi sai, vì vậy đây là một số sửa chữa. Tôi biết rằng tôi chỉ có thể sử dụng hex hoặc thập phân thay vì nhị phân, tôi chỉ muốn biết cách "đúng" để sử dụng chữ nhị phân là gì. Về tôi nói rằng // bình luận là "sai", tôi nhận được điều đó từ một cảnh báo trình biên dịch, không ai nói với tôi rằng, nhưng trình biên dịch. Dù sao, cảm ơn tất cả những người giúp đỡ! Tôi đã nhận được một số câu trả lời tuyệt vời và tôi ước tôi có thể đánh dấu tất cả chúng là câu trả lời nhưng tôi có thể làm điều đó chỉ với một điều đáng buồn. – hak8or

Trả lời

13

C không có hằng số nhị phân. (Ngay cả trong C11 chúng không được hỗ trợ.)

Chúng được đề xuất như là một bổ sung cho C99 nhưng đề xuất đã bị từ chối.

Từ C99 tài liệu Lý do:

Một đề xuất để thêm hằng số nhị phân đã bị từ chối vì thiếu tiền lệ và đủ tiện ích.

Bạn cho biết bạn đang sử dụng trình biên dịch dựa trên gccgcc hỗ trợ các hằng số nhị phân: chúng là phần mở rộng của GNU cho ngôn ngữ C.

hằng Integer có thể được viết như hằng số nhị phân, bao gồm một chuỗi các 01 chữ số, bắt đầu bằng 0b hoặc 0B. Điều này đặc biệt hữu ích trong các môi trường hoạt động rất nhiều trên mức bit (như vi điều khiển).

Xem gcc trang về hằng số nhị phân để biết thêm thông tin:

http://gcc.gnu.org/onlinedocs/gcc/Binary-constants.html

+0

Rất tiếc, họ cảm thấy nó không đủ tiện ích. Tôi sử dụng '0b' tất cả các thời gian trong mã mà bit-twiddling cho các hoạt động số nguyên tốc độ cao (không có gì để làm với vi điều khiển). Ví dụ '0b10101010' dễ đọc hơn' 0xAA'. Ngoài ra một con số thấp mà họ cảm thấy không có tiền lệ; Java đã có '0b' trong một thời gian. –

3

C11 không có chữ số nhị phân; nó chỉ có số thập phân, bát phân và thập lục phân, như được mô tả trong phần 6.4.4.1 của tiêu chuẩn. Điều này không thay đổi so với C99.

6.6 Đoạn 10 nói:

An thực hiện có thể chấp nhận các hình thức biểu hiện liên tục.

, nếu tôi hiểu chính xác, hãy cho phép loại trình biên dịch của bạn cung cấp; điều này cũng không thay đổi so với C99.

Cách giải quyết thông thường là sử dụng chữ số thập lục phân; mỗi chữ số thập lục phân tương ứng với bốn chữ số nhị phân. (Và tất nhiên, 0b000 có thể được viết đơn giản là 0.)

+0

Cảm ơn câu trả lời của bạn. :) – hak8or

1

Tiền tố nhị phân không phải là tiêu chuẩn. chuyển đổi chúng sang bát phân (0) hoặc thập lục phân (0x) thay vào đó, chỉ là tiền tố được xác định trong tiêu chuẩn.

Ngoài ra, // nhận xét đã được giới thiệu trong tiêu chuẩn C99, chúng không có trong tiêu chuẩn ANSI C89. Đó là lý do tại sao trình biên dịch của bạn cung cấp cho bạn một cảnh báo.

+0

Cảm ơn bạn đã trả lời. :) – hak8or

2

tiêu chuẩn Về:

  • ANSI C/"Strict ANSI" thường đề cập đến phiên bản tiêu chuẩn đầu tiên của C, chỉ có chuẩn ở Mỹ năm 1989. Đôi khi nó được gọi là "C89".
  • ANSI C/89 trở nên lỗi thời vào năm 1990 khi C trở thành tiêu chuẩn C quốc tế, ISO/IEC 9899: 1990, được gọi là "C90". C89 và C90 là tương đương khi nói đến chi tiết kỹ thuật.
  • C90 trở nên lỗi thời vào năm 1999, khi ISO C được cập nhật. Tiêu chuẩn mới được gọi là "C99".
  • C99 trở nên lỗi thời vào năm 2011. Tiêu chuẩn mới được gọi là "C11".

Về vấn đề biên dịch của bạn:

  • C89/C90 không cho phép // ý kiến. Chúng được giới thiệu trong C99.Chúng chưa được gỡ bỏ trong C11.
  • Ký hiệu nhị phân chưa bao giờ là một phần của bất kỳ tiêu chuẩn C nào.

Kết luận:

  • Bạn có nhiều khả năng biên dịch mã trên một trình biên dịch C90, với một số phần mở rộng phi tiêu chuẩn có sẵn.
+0

Cảm ơn bạn đã trả lời. :) – hak8or