2015-12-21 13 views
5

Tôi đã đọc http://www.cplusplus.com/doc/tutorial/typecasting/. Nó nói rằng:Chuyển đổi giữa các loại số cùng loại

  • Ngược lại, nếu việc chuyển đổi giữa các loại số của cùng một loại (nguyên-to-số nguyên hoặc nổi-to-thả nổi), việc chuyển đổi là hợp lệ, nhưng giá trị thực hiện cụ thể (và có thể không di động).

Nhưng tôi thực sự không hiểu câu nói trên có ý nghĩa gì? Có ai đó vui lòng giải thích nó bằng một ví dụ đơn giản không? Tại sao chuyển đổi giữa loại số cùng loại kết quả trong giá trị thực hiện cụ thể? Lý do là gì?

Trả lời

5

Hãy xem xét ví dụ sau:

long long int lli = 5000000000; 
    long int li; 
    int i; 
    li = lli; 
    i = li; 

Bạn có thể dự đoán các giá trị của lli, lii? Hoặc liệu lii có cùng giá trị không?

Trả lời là - các giá trị phụ thuộc vào số lượng byte được phân bổ cho từng loại! I.e. đối với một số trường hợp, số int bằng long int, đối với những người khác long int bằng long long int, nhưng nói chung loại long er chỉ có thể dài hơn. Tương tự (theo nghĩa kích thước bộ nhớ) cho float, doublelong double.

+0

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

+2

@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

+0

@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

1

Đ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 doubledouble.

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