Nó có nghĩa là hành vi không xác định :-).
Nghiêm túc đấy, đây là một hình thức xảo quyệt. a
là float
, nhưng a
cũng là một khối bộ nhớ (thường là bốn byte) với các bit trong đó. (float&)a
có nghĩa là để xử lý khối bộ nhớ đó như thể nó là một float
(nói cách khác, nó thực sự là gì); (int&)a
có nghĩa là coi nó là int
. Chính thức, truy cập một đối tượng (chẳng hạn như a
) thông qua một biểu thức lvalue với một loại khác với loại thực tế của đối tượng là hành vi không xác định, trừ khi loại là một loại ký tự. Thực tế, nếu hai loại có cùng kích thước, tôi sẽ mong đợi kết quả là sự diễn giải lại mẫu bit.
Trong trường hợp của float
, mẫu bit chứa bit cho dấu, số mũ và số nguyên. Thông thường,, số mũ sẽ sử dụng một số ký hiệu thừa, và chỉ 0.0
sẽ có 0 làm số mũ. (Một số biểu diễn, kể cả biểu diễn được sử dụng trên PC, sẽ không lưu trữ bit thứ tự cao của mantissa, vì ở dạng bình thường trong cơ số 2, nó luôn luôn là 1. Trong trường hợp đó, phần lưu trữ cho 1.0
sẽ có tất cả bit 0.) Cũng thường (và tôi không biết bất kỳ ngoại lệ nào ở đây), số mũ sẽ được lưu trữ trong các bit thứ tự cao. Kết quả là khi bạn "gõ pun" một giá trị dấu chấm động cho một số nguyên có cùng kích thước, giá trị sẽ khá lớn, bất kể giá trị dấu phẩy động.
Nguồn
2012-05-10 07:55:47
Đây có phải là bài tập về nhà không? – caskey