Có sự khác biệt nào giữa loại truyền & loại chuyển đổi bằng C++ hay không.Có sự khác biệt nào giữa loại chuyển đổi loại và loại không?
Trả lời
Nói chung, đúc dùng để chỉ một chuyển đổi rõ ràng, cho dù nó được thực hiện bởi C-style cast (T(v)
hoặc (T)v
) hoặc C++ - phong cách cast (static_cast
, const_cast
, dynamic_cast
, hoặc reinterpret_cast
). Chuyển đổi nói chung là một thuật ngữ chung chung hơn được sử dụng cho bất kỳ lúc nào một biến được chuyển đổi sang một biến khác:
std::string s = "foo"; // Conversion from char[] to char* to std::string
int i = 4.3; // Conversion from float to int
float *f = reinterpret_cast<float*>(&i); // (illegal) conversion from int* to float*
Một trong những khác biệt lớn xảy ra khi bạn làm việc với chuỗi. Bạn không thể nói (int) "234" và nhận được số nguyên 234. Loại đúc thường chỉ hoạt động trên các kiểu dữ liệu số nguyên thủy.
Loại đúc nghĩa là bạn lấy một chuỗi bit và diễn giải chúng khác nhau. Loại chuyển đổi có nghĩa là bạn chuyển đổi một chuỗi các bit từ một cấu hình hữu ích trong một ngữ cảnh thành một cấu hình hữu ích trong một ngữ cảnh khác.
Ví dụ, giả sử tôi viết
int x=65;
char c=(char) x;
char* s=(char*) x;
c bây giờ sẽ chứa ký tự 'A', bởi vì nếu tôi diễn giải các số thập phân 65 như một nhân vật, tôi nhận được lá thư 'A'. s bây giờ sẽ là một con trỏ đến một chuỗi ký tự cư trú tại vị trí bộ nhớ 65. Điều này gần như chắc chắn là một điều vô dụng để làm, như tôi không có ý tưởng những gì đang ở vị trí bộ nhớ đó.
itoa(x, s, 10);
là một loại chuyển đổi. Điều đó sẽ cho tôi chuỗi "65".
Tức là, với phôi, chúng tôi vẫn đang xem cùng một vị trí bộ nhớ. Chúng tôi chỉ giải thích dữ liệu ở đó một cách khác nhau. Với các chuyển đổi, chúng tôi đang tạo ra dữ liệu mới có nguồn gốc từ dữ liệu cũ, nhưng nó không giống với dữ liệu cũ.
Vì vậy, bạn đang nói, 'reinterpret_cast' thực hiện truyền, nhưng' static_cast' (mặc dù tên của nó) thực hiện chuyển đổi? Tôi sẽ thấy rằng khó hiểu nhất. – jogojapan
Loại đúc có thể làm một số tiền tối thiểu của chuyển đổi:
signed char Schar; // 1 byte (8 bits) to hold 256 values: -128 to 127
unsigned char Uchar; // 1 byte (8 bits) to hold 256 values: 0 to 255
...
if (Schar < -10 ) ... // compiler uses SIGNED comparision
Uchar = Schar; // implicit conversion only copies the 8 bits
Uchar = (char) Schar; // explicit conversion may be required by compiler
if (Uchar > 200) ... // compiler uses UNSIGNED comparision
...OR...
if ((unsigned char) Schar > 200) ... // explicit conversion for UNSIGNED comparision
short Sshort; // 2 bytes (16 bits) to hold 65536 values: -32768 to 32767
unsigned short Ushort; // 2 bytes (16 bits) to hold 65536 values: 0 to 65536
...
// when moving 8 bits into 16 bit variables, what to do with other 8 bits ?
Sshort = (signed short) Uchar; // move 8 bits over and use 0s for other 8 bits
Sshort = (signed short) Schar; // same, but use 1s if negative to make Sshort negative
Nhưng điều này có thể được coi Loại chuyển đổi:
float dbl; // 4 bytes to store floating number in IEEE format
long lng; // 4 bytes to store 32 bit integer value in 2's complement format
...
dbl = lng; // convert from 2's comp to IEEE format - all bits change !
dbl = (float) lng; // explicit form
LƯU Ý: int
thường là giống như short
hoặc long
tùy thuộc vào trình biên dịch/CPU LƯU Ý: signed
thường là tùy chọn vì đây thường là mặc định
Không chuyển đổi diễn ra khi bạn chỉ định tất cả các biến chiếm không gian bộ nhớ giống nhau:
typedef union MYUNION // all members occupy same space (memory bytes)
{
signed char Schar; // usual default for char
unsigned char Uchar;
signed short Sshort; // usual default for short
unsigned short Ushort;
signed long Slong; // usual default for long
unsigned long Ulong;
float flt;
double dbl;
};
MYUNION myunion;
myunion.Schar = ... // set variable (memory byte) to value
if ((unsigned char) myunion.Schar > 200) ... // unsigned compare works ok
... is same as (also without moving any data around) ...
if (myunion.Uchar > 200) ... // unsigned compare works ok
... myunion.Sshort ... // other 8 bits are UNASSIGNED GARBAGE !
myunion.Sshort = myunion.Schar; // provide all 16 bits from Schar
... myunion.Sshort ... // Sshort of valid now
myunion.dbl = 12345.0;
... myunion.Ulong ... // has weird value from odd IEEE bit format
myunion.Ulong = (unsigned long) myunion.dbl; // do explicit conversion
... myunion.Ulong ... // has CONVERTED 12345 value
LƯU Ý: *(unsigned long*)&dbl
cũng sản xuất giá trị kỳ lạ. Nó có: a) lấy địa chỉ (vị trí của bit và byte) của double dbl b) xem xét địa chỉ như một địa chỉ của một unsigned dài c) được unsigned dài từ vị trí đó Tất nhiên, có một số ứng dụng thực tế của kỹ thuật này. Ví dụ: phân tích cú pháp tệp nhị phân bên ngoài phức tạp hoặc trên CPU có 512 byte bộ nhớ, v.v.
- 1. Có sự khác biệt giữa khách hàng Loại hình Enum Loại và hệ thống Enum
- 2. Sự khác biệt giữa loại (obj) và obj .__ class__
- 3. Sự khác biệt giữa giá trị (loại) và loại (giá trị) là gì?
- 4. Có sự khác biệt nào giữa MIME và loại nội dung không?
- 5. Sự khác biệt giữa phân loại và phân loại topo là gì?
- 6. Sự khác biệt giữa các Loại Message XMPP khác nhau?
- 7. Sự khác biệt giữa loại và loại dữ liệu trong Haskell là gì?
- 8. Sự khác nhau giữa các loại regex
- 9. Sự khác biệt giữa <script> thẻ với loại và <script> không có loại?
- 10. Sự khác biệt giữa các loại tham số
- 11. Kiểm tra xem chuỗi có thể được chuyển đổi thành loại khác không, loại khác nhau
- 12. Sự khác nhau giữa loại không được quản lý và loại được quản lý là gì?
- 13. Sự khác nhau giữa các loại giá trị và loại tham chiếu trong C# là gì?
- 14. Sự khác biệt trong loại giữa việc sử dụng và không sử dụng Đặt từ khóa
- 15. Chuyển đổi giữa các loại trong Haskell
- 16. Sự khác nhau giữa "số nhận dạng loại" và "loại" trong Cython là gì?
- 17. Sự khác biệt giữa các định nghĩa tham số là (loại & tên), và (loại * tên) là gì?
- 18. Chuyển đổi loại Groovy
- 19. Chuyển đổi tham số từ loại 'System.String' thành loại '' X 'không thành công vì không có trình chuyển đổi loại nào có thể chuyển đổi giữa các loại này
- 20. Sự khác biệt giữa loại mảng và mảng được phân bổ với malloc
- 21. Sự khác biệt giữa các loại nguyên thủy và tham chiếu là gì?
- 22. Chuyển đổi loại Int
- 23. Sự khác biệt giữa bản đồ, từng loại và thu thập là gì?
- 24. Sự khác biệt giữa loại trung bình, kiểu nội dung và mimetype là gì?
- 25. Whats sự khác biệt giữa các loại tệp .Resx và .Resources?
- 26. Giải thích sự khác biệt giữa cấu trúc * dữ liệu * và loại dữ liệu *
- 27. Sự khác biệt giữa phụ thuộc loại "nhập" và "pom" là gì?
- 28. [ARM CortexA] Sự khác biệt giữa loại bộ nhớ được đặt hàng và thiết bị
- 29. Sự khác biệt giữa loại trừ lẫn nhau và đồng bộ hóa?
- 30. Sự khác biệt giữa loại đối tượng và kiểu tham chiếu
do đó không có sự khác biệt nào –
Sự khác biệt là dàn diễn viên * rõ ràng *. Các từ khóa C++ có thể được grep'ed. Cả diễn viên C và C++ đều cho thấy việc chuyển đổi đã được thực hiện đúng mục đích và với sự đồng ý của lập trình viên.Một chuyển đổi tiềm ẩn có thể được dự định, hoặc do nhầm lẫn. – DevSolar