Gonna đưa ra câu hỏi của riêng tôi tại đây.
Có sự khác biệt 32 bit/64 bit.
Trong các hệ thống 32 bit, loại phao phải chiếm hai không gian bộ nhớ để nhận 64 bit bắt buộc. Php sử dụng độ chính xác gấp đôi (xem http://en.wikipedia.org/wiki/Floating_point#IEEE_754:_floating_point_in_modern_computers)
Giá trị $ hex được đánh giá là loại phao. Hàm intval và decbin chuyển đổi kiểu này thành kiểu int (ví dụ 1 ở trên)
Trong ví dụ thứ hai, chúng ta đang sử dụng toán tử bitwise TRƯỚC KHI chúng ta sử dụng decbin. Điều này lật các bit trong phao chính xác không gian hai bộ nhớ chính xác đầu tiên, và sau đó được chuyển thành int thứ hai.Cung cấp cho chúng tôi một cái gì đó khác với những gì chúng tôi mong đợi.
Thật vậy, nếu chúng ta đặt phủ nhận bên trong của intval() như sau:
$hex = 0x80008000;
print_r(decbin(intval(~$hex)) . '<br/>');
print_r(decbin(~$hex));
Chúng tôi nhận được
1111111111111111111111111111111
1111111111111111111111111111111
Như đầu ra.
Tôi không đủ tốt để chứng minh điều này bằng toán học (có thể được tìm ra với sự trợ giúp của bài viết này http://en.wikipedia.org/wiki/Double_precision). Nhưng có lẽ khi tôi có thời gian sau -_-
Tôi nghĩ rằng việc tìm hiểu cách số được biểu diễn trong máy tính là rất quan trọng để chúng tôi có thể hiểu được những bất thường như thế này và không gọi chúng là lỗi.
Bạn đang sử dụng phiên bản PHP nào? Trường hợp thứ hai hoạt động với tôi trên 5.3.6 –
Tôi đang chạy 5.3.8 và sự cố tồn tại. – Pateman
Tôi đang sử dụng 5.2.17 – Vigrond