2010-07-01 36 views
5

Tôi có một macro mà trông giống như sau:"Bitwise Và" và trái Padding trong C++

Foo(x) ((x - '!') & 070) 

Nếu tôi gọi đoạn mã sau:

Foo('1') => 16 

Tuy nhiên, nếu tôi gọi là mã sau:

(('1' - '!') & 70) => 0 

Vì vậy, câu hỏi của tôi là, những gì đang xảy ra ở đây? Tại sao x & 070 tính cho x nhưng x & 70 tính cho 0?

Đoán của tôi là số 0 thừa ở bên trái đang buộc 60 phải lấy 2 byte thay vì 1. Trong trường hợp đó, không phải bitwise & như sau?

0000 0000 0001 0000  '16 
0000 0000 0100 0110 & '70 
------------------- 
0000 0000 0000 0000 
+0

Tôi biết câu trả lời này (0 tiền tố = hằng số bát phân) nhưng tôi có thể thành thật mà nói trong hơn 20 năm lập trình C, tôi chưa bao giờ thấy nó được sử dụng. Nó chỉ là một trong những thứ mà dường như có nguồn gốc từ một thời điểm khi nó sẽ hữu ích, có thể là một cái gì đó để làm với máy teletype hoặc bất cứ điều gì. Là một người nhúng, tôi luôn miffed rằng không có cái gì giống như một tiền tố 'b' cho hằng số nhị phân (có, tôi có cách riêng của tôi làm điều này trong C & C++, quá xấu nó không được xây dựng vào ngôn ngữ). – Dan

Trả lời

12

Trong C++, hằng số có hằng sốhàng đầu là hằng số bát phân, không phải là hằng số thập phân. Nó vẫn là một hằng số nguyên nhưng 070 == 56.

Đây là nguyên nhân của sự khác biệt về hành vi.

+0

Cảm ơn, tôi đã mong đợi nó là một điều đơn giản, nhưng không nhận ra tôi đã ở sai căn cứ! – sohum

7

Không, số 0 bổ sung nghĩa là số được đọc dưới dạng bát phân (cơ số 8). Điều đó có nghĩa nó không nói 70, nhưng 56:

0000 0000 0001 0000  '16 
0000 0000 0011 1000 & '56 
------------------- 
0000 0000 0001 0000 
3

prepending các 070 với một 0 như bạn đang làm cho trình biên dịch để giải thích nó như bát phân, thập phân không. Bạn có thể muốn nói 70.

3

Như những người khác đã nói, 070 là một hằng số bát phân (và 0x70 một thập lục phân), là nơi mà vấn đề của bạn nằm.

Tôi muốn thêm, tuy nhiên, bạn nên sử dụng inline chức năng thay vì macro:

inline int Foo(int x) { return (x - '!' & 070); } 

C++ đã làm rất nhiều để cho phép chúng ta thoát khỏi những tiền xử lý cho nhiều điều, bởi vì nó xấu, không đúng và nguy hiểm. Nếu bạn có thể làm mà không có nó, làm như vậy.
(Và nếu bạn sử dụng nó, ít nhất có lòng thương xót đối với những người phải đối phó với mã của bạn sau này để tạo macro toàn hoa.)

+0

Mã gốc thực sự được viết bởi người khác. Tôi chỉ đơn thuần là chuyển nó sang một ngôn ngữ khác. – sohum

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