Đoạn mã đề cập đến việc thu hẹp chuyển đổi giữa các loại điểm nổi và tích phân tương ứng. Tức là, nó nói rằng mặc dù một chuyển đổi giữa các kiểu tích phân hoặc giữa các kiểu dấu chấm động là hợp lệ, giá trị kết quả sẽ được thực hiện được xác định.
Như một ví dụ xem xét các đoạn mã sau:
#include <iostream>
#include <limits>
int main() {
long long lgm = std::numeric_limits<long long>::max();
std::cout << std::hex << lgm << std::endl;
int i = lgm;
std::cout << std::hex << i << std::endl;
long double ldb = std::numeric_limits<long double>::max();
std::cout << std::hex << ldb << std::endl;
double db = ldb;
std::cout << std::hex << db << std::endl;
}
Output:
7fffffffffffffff
ffffffff
1.18973e+4932
inf
Như bạn có thể nhìn thấy giá trị tối đa long long
số nguyên vượt quá khả năng của một số nguyên đơn giản. Tuy nhiên, bạn có thể chuyển đổi số long long
thành số int
(nghĩa là chuyển đổi hợp lệ), nhưng do thực tế là int
không thể giữ giá trị tối đa là long long
không thể có chuyển đổi chính xác. Vì vậy, giá trị của kết quả int
còn lại để được quyết định bởi việc thực hiện. Điều này cũng đúng với chuyển đổi giữa long double
và double
.
Vì vậy, có thể dài không lớn hơn int Một số thực hiện C++? Bạn có biết thực hiện như vậy không? – Destructor
@PravasiMeet Đó là trường hợp phổ biến thực sự. Visual Studio x86 và x64 và gcc x86 có sizeof (dài) == sizeof (int) nếu tôi không nhầm lẫn và tôi sẽ không ngạc nhiên nếu clang đã làm như vậy. – Pixelchemist
@Pixelchemist: có gcc 5.2.0 & clang 3.5.0 cũng làm như vậy. Xem bản trình diễn trực tiếp http://melpon.org/wandbox/permlink/IsGDktKO5VUBY0KV & http://melpon.org/wandbox/permlink/6icDnbxu4hAIkwMN. Tôi đã nhận 5000000000 như là một đầu ra 3 lần. Nhưng khi tôi chạy nó trên http://webcompiler.cloudapp.net/ nó mang lại cho tôi 5000000000 705032704 705032704 như là một đầu ra. Tôi hy vọng các nhà văn trả lời ban đầu thêm các liên kết này vào câu trả lời của mình. – Destructor