Mẫu bit logic (bit đại diện giá trị), nghĩa là giá trị của chữ số nhị phân chỉ có thể được giữ nguyên nếu giá trị đã ký ban đầu không âm, vì giá trị âm không thể được biểu thị bằng biến số nguyên không dấu. Tất cả những gì bạn cần làm là gán giá trị đã ký cho đối tượng tích phân chưa được ký của mình và bạn đã hoàn thành
uint64_t u_val = s_val;
Không sử dụng diễn xuất rõ ràng, nhưng có thể được sử dụng để ngăn chặn cảnh báo trình biên dịch.
Đối với mẫu bit vật lý (tức là những gì bạn nhìn thấy trong bộ nhớ thô, bit của biểu diễn đối tượng), bạn chỉ đơn giản là không thể "chuyển đổi" theo cách đó. Ngôn ngữ C++ không cung cấp cho bạn bất kỳ phương thức chuyển đổi nào đảm bảo bảo toàn mẫu bit vật lý.Tất cả các bạn có thể làm là diễn giải lại bộ nhớ bị chiếm đóng bởi các đối tượng ký kết như một đối tượng unsigned của cùng một kích thước
STATIC_ASSERT(sizeof(int64_t) == sizeof(uint64_t));
uint64_t u_val = reinterpret_cast<uint64_t&>(s_val);
Một lần nữa, đây không phải là một chuyển đổi, mà là một lối trình diễn bộ nhớ. Điều này không được bảo đảm để làm việc và điều này nói chung là bất hợp pháp.
Tăng phiếu bầu cho tất cả mọi người; Cảm ơn vì đầu vào của bạn. Tôi nghĩ rằng static_cast là trong thực tế, câu trả lời đúng. Đối với các hồ sơ, tôi đã thử nó đầu tiên, nhưng do một lỗi dunderheaded ở nơi khác tôi nghĩ rằng nó đã không được bảo quản các mẫu bit. Để làm rõ câu hỏi, không sao là s_val! = U_val (sẽ là trường hợp nếu s_val <0). Các bit là những gì quan trọng. – bbg