Chuyển đổi giá trị thành một loại đã ký, khi giá trị nguồn không phù hợp với loại mục tiêu, hãy mang lại kết quả được xác định thực hiện. Điều đó có nghĩa là bất kỳ tài liệu nào của trình biên dịch phù hợp phải ghi lại kết quả đó là gì.
(Điều này là không giống như các hành vi trên tràn của một toán tử số học Ví dụ:.
int overflow = INT_MAX + 1;
thực sự có hành vi undefined Nhưng trong cả hai trường hợp, bạn nên cẩn thận để viết mã của bạn để nó doesn. Để kích hoạt loại vấn đề này.)
Đối với nhiều triển khai, cho cả chuyển đổi và số học, tràn mà đích là loại N-bit chỉ cần lấy N bit thứ tự thấp của kết quả chính xác.
Trong trường hợp của bạn, rõ ràng int
là 32 bit và short
là 16 bit (các kích thước có thể khác nhau trên các triển khai khác nhau). 2147483647
là 0x7fffffff
, thứ tự 16 bit thấp là 0xffff
, đó là (một lần nữa, khi bạn triển khai) biểu thị của -1
trong loại short
.
Để chuyển đổi thành loại chưa ký, kết quả được xác định nghiêm ngặt theo tiêu chuẩn; nó có các bit N thứ tự thấp của kết quả. Và đối với việc chuyển đổi dấu chấm động tràn (giả sử, chuyển đổi giá trị double
rất lớn thành float
), hành vi này là không xác định.
Cho đến nay, điều này cũng giống nhau đối với C và C++. Nhưng chỉ để thêm vào sự nhầm lẫn, bắt đầu với tiêu chuẩn năm 1999, một chuyển đổi có dấu tràn được phép nâng cao một tín hiệu được xác định. C++ không có cái này. Tôi không biết bất kỳ trình biên dịch nào thực sự làm điều này.
Tôi mong đợi để xem một số giá trị và không-1
.
-1
là "một số giá trị". Có một số giá trị cụ thể mà bạn mong đợi không?
Ngẫu nhiên:
short b = (short)a;
Dàn diễn viên là không cần thiết. Các lệnh gán, khởi tạo, truyền tham số và các câu lệnh return
có thể gán các giá trị giữa bất kỳ loại số nào mà không có phép đúc. Giá trị được chuyển đổi ngầm:
short b = a;
Tôi muốn nói, giá trị không phù hợp, vì vậy kết quả không xác định. –
'-1' * là *" một số giá trị ". Và diễn viên '(ngắn) 'là không cần thiết; chuyển đổi sẽ được thực hiện hoàn toàn: 'short b = a;' –
@BartFriederichs: Kết quả của việc chuyển đổi là * thực hiện xác định *, không được xác định. –