2010-05-24 40 views
5

Ứng dụng lớn này có thư viện bộ nhớ trong hồ bơi sử dụng bộ nhớ trong để lưu trữ các nút bộ nhớ. Treap được thực hiện bằng cách sử dụng macro cpp và tệp trp.h hoàn chỉnh có thể được tìm thấy here. Tôi nhận được cảnh báo trình biên dịch sau khi tôi cố gắng để biên dịch ứng dụng:Giải mã cảnh báo trình biên dịch liên tục về hằng số thập phân chưa ký

warning: this decimal constant is unsigned only in ISO C90 

Bằng cách xóa các phần của mã vĩ mô và sử dụng thử nghiệm và lỗi, cuối cùng tôi tìm ra thủ phạm:

#define trp_prio_get(a_type, a_field, a_node)    \ 
    (2654435761*(uint32_t)(uintptr_t)(a_node)) 

tôi Tôi không chắc con số lạ đó đang làm gì ở đó, nhưng tôi cho rằng nó có lý do chính đáng, vì vậy tôi chỉ muốn để nó một mình. Tôi muốn sửa chữa các cảnh báo mặc dù-bất kỳ ý tưởng tại sao trình biên dịch của nói rằng nó unsigned chỉ trong ISO C90?

EDIT: Tôi đang sử dụng gcc-4,1

+0

Sẽ hữu ích khi cho chúng tôi biết bạn đang sử dụng trình biên dịch nào. – AndrejaKo

+0

Cảnh báo cũng có lý do.Nó cho bạn biết rằng loại chữ đã thay đổi từ phiên bản C sang phiên bản C khác, vì vậy bất kỳ lý do chính đáng nào mà nhà phát triển ban đầu có thể sai, điều này có thể phá vỡ mã của bạn theo những cách thú vị. – gnasher729

Trả lời

6

Cố gắng thay thế con số đó với

2654435761u 

để buộc nó unsigned.

+0

Hoạt động tốt, cảm ơn :) – artagnon

6

2654435761 là số tỷ lệ vàng tương ứng với 2^32.

Trong "The Art of Computer Programming " của Knuth, phần 6.4, một chương trình nhân giống băm là giới thiệu như là một cách để viết băm chức năng. Khóa được nhân với tỷ lệ vàng 2^32 (2654435761) đến tạo kết quả băm.

Từ 2654435761 và 2^32 không có yếu tố chung chung, các nhân tạo ra một bản đồ hoàn chỉnh của chìa khóa để băm kết quả với không chồng chéo lên nhau. Phương pháp này hoạt động khá tốt nếu các khóa có giá trị nhỏ. Kết quả băm không hợp lệ được tạo ra nếu các phím thay đổi theo các bit trên. Như là đúng trong tất cả các phép nhân, các biến thể của chữ số trên không ảnh hưởng đến các chữ số thấp hơn của kết quả phép nhân .

http://www.concentric.net/~Ttwang/tech/inthash.htm

+1

Điều gì chính xác là có nghĩa là bởi tỷ lệ vàng của một số? (Và OP hỏi về cảnh báo, mặc dù tôi chắc chắn rằng nền tảng cho con số được đánh giá cao.) – Cascabel

+0

Không có bất kỳ số lẻ nào chia sẻ thuộc tính "không có yếu tố phổ biến"? 2^n-1 là 3 * 5 * 17 * 157 * 65537, nary một hai trong tầm nhìn. ;) –

+0

@Jefromi: http://en.wikipedia.org/wiki/Golden_ratio – Amber

2

Tôi nghĩ rằng đó là unsigned vì nó lớn hơn 2,147,483,647, đó là kích thước tối đa cho số nguyên dài ký, vì vậy để tránh bọc xung quanh, nó đối xử với nó như unsigned và đưa ra cảnh báo.

+0

Cảm ơn bạn đã giải thích :) – artagnon

2

Vấn đề là hằng số này 2654435761 lớn hơn 2^31. Điều này có nghĩa rằng với các trình biên dịch cũ hơn, nó sẽ thực sự biến thành một giá trị âm như một hằng số đã ký.

Bây giờ, trong trường hợp này không quan trọng, do được nhân với giá trị chưa ký, nó sẽ được chuyển trở lại thành unsigned và điều đúng sẽ xảy ra.

+0

Cảm ơn bạn đã giải thích :) – artagnon

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