Tôi đoán ý nghĩa của câu hỏi là chìa khóa là gì. Khi bạn nói mất mát, bạn có nghĩa là bạn đang mất byte hoặc một cái gì đó như thế. Bạn không mất bất cứ thứ gì như vậy vì kích thước của cả hai đều giống nhau, chúng chỉ có phạm vi khác nhau.
char đã ký và char chưa ký sẽ không được đảm bảo bằng nhau. Khi hầu hết mọi người nghĩ rằng unsigned char, họ đang nghĩ từ 0 đến 255.
Trên hầu hết các triển khai (tôi phải báo trước vì có sự khác biệt), ký char và unsigned char là 1 byte hoặc 8 bit. ký char thường từ -128 đến +127 trong khi unsigned char là từ 0 đến +255.
Theo như chuyển đổi, nó còn lại để triển khai khác nhau để đưa ra câu trả lời. Nói chung, tôi sẽ không khuyên bạn nên chuyển đổi giữa hai người. Đối với tôi, nó có ý nghĩa là nó sẽ cung cấp cho bạn tương đương TÍCH CỰC nếu giá trị là tiêu cực và vẫn giữ nguyên nếu là dương. Ví dụ trong Borland C++ Builder 5, được đưa ra signed char test = -1
và bạn đưa nó vào unsigned char
, kết quả sẽ là 255. Ngoài ra, kết quả sẽ khác nếu tất cả các giá trị là dương.
Nhưng theo như so sánh, trong khi các giá trị có thể xuất hiện giống nhau, chúng có thể sẽ không được đánh giá như nhau. Đây là một chuyến đi lớn lên khi các lập trình viên đôi khi so sánh các giá trị đã ký và chưa ký và tự hỏi tại sao tất cả dữ liệu trông giống nhau, nhưng điều kiện sẽ không hoạt động đúng. Một trình biên dịch tốt nên cảnh báo bạn về điều này.
Tôi có ý kiến rằng cần có một chuyển đổi tiềm ẩn giữa chữ ký và unsigned để nếu bạn chuyển từ cái này sang cái kia, trình biên dịch sẽ chăm sóc chuyển đổi cho bạn. Việc cài đặt của trình biên dịch là tùy thuộc vào việc bạn có mất ý nghĩa ban đầu hay không. Thật không may là không có đảm bảo rằng nó sẽ luôn luôn làm việc.
Cuối cùng, từ tiêu chuẩn, phải tồn tại một chuyển đổi đơn giản giữa char đã ký hoặc char chưa ký thành char. Nhưng nào nó chọn để có, là thực hiện được xác định
3.9.1 loại cơ bản [basic.fundamental]
1 đối tượng khai báo là ký tự char) phải đủ lớn để lưu trữ bất kỳ viên của việc thực hiện của bộ ký tự cơ bản . Nếu một ký tự từ bộ này được lưu trữ trong một đối tượng ký tự, giá trị tích phân của đối tượng ký tự đó bằng giá trị của dạng ký tự đơn của ký tự đó. Nó là thực hiện được xác định cho dù một đối tượng char có thể giữ giá trị âm. Các ký tự có thể được khai báo rõ ràng chưa ký hoặc được ký. Đồng bằng char, ký char và char chưa ký là ba loại riêng biệt. Một char, một chữ ký có chữ ký, và một ký tự chưa ký chiếm cùng một số lượng lưu trữ và có cùng một yêu cầu liên kết (basic.types); nghĩa là chúng có cùng đối tượng đại diện. Đối với các loại ký tự, tất cả các bit của đối tượng đại diện tham gia vào giá trị đại diện . Đối với ký tự chưa ký loại, tất cả các mẫu bit có thể có của đại diện giá trị đại diện cho số . Những yêu cầu này không giữ các loại khác. Trong bất kỳ triển khai cụ thể nào, đối tượng char đơn giản có thể nhận được các giá trị giống như một thẻ được ký hoặc char chưa ký; cái nào là được xác định thực hiện.
Gần-bản sao của http://stackoverflow.com/questions/50605/signed-to-unsigned-conversion-in-c-is-it-always-safe – dan04
Một câu hỏi khác có thể là một gần bờ trùng lặp, nhưng câu trả lời được chấp nhận của nó là sai. –