Câu trả lời khủng khiếp Galore
Ozgur Ozcitak
Khi bạn chuyển từ đã ký sang không dấu (và ngược lại), biểu diễn bên trong của số không thay đổi. Những thay đổi là cách trình biên dịch diễn giải bit dấu.
Điều này là hoàn toàn sai.
Thảm Fredriksson
Khi một biến không dấu và một biến được ký được thêm vào (hoặc bất kỳ hoạt động nhị phân nào), cả hai đều được chuyển đổi hoàn toàn thành không dấu, trong trường hợp này sẽ dẫn đến một kết quả rất lớn.
Điều này cũng sai. Số nguyên không được ký có thể được thăng cấp thành số nguyên nếu chúng có độ chính xác bằng nhau do các bit đệm trong loại không dấu.
smh
Hoạt động bổ sung của bạn làm cho int được chuyển đổi thành int không dấu.
Sai lầm. Có lẽ nó làm và có thể nó không.
Chuyển đổi từ int unsign sang int đã ký là phụ thuộc thực hiện. (Nhưng nó có thể hoạt động theo cách bạn mong đợi trên hầu hết các nền tảng hiện nay.)
Sai lầm. Đó là hành vi không xác định nếu nó gây ra tràn hoặc giá trị được bảo toàn.
Vô danh
Giá trị của i được chuyển đổi thành ...
Sai lầm. Phụ thuộc vào độ chính xác của một int so với int không dấu.
Giá Taylor
Như đã được trả lời trước đó, bạn có thể bỏ qua lại giữa ký và không dấu mà không có vấn đề gì.
Sai lầm. Cố gắng lưu trữ một giá trị bên ngoài phạm vi của một số nguyên đã ký dẫn đến hành vi không xác định.
Bây giờ tôi cuối cùng có thể trả lời câu hỏi.
Nếu độ chính xác của int bằng với int unsign, u sẽ được thăng cấp thành int đã ký và bạn sẽ nhận được giá trị -4444 từ biểu thức (u + i). Bây giờ, nếu bạn và tôi có các giá trị khác, bạn có thể có hành vi tràn và không xác định nhưng với những con số chính xác đó, bạn sẽ nhận được -4444 [1] . Giá trị này sẽ có kiểu int. Nhưng bạn đang cố lưu trữ giá trị đó vào một số nguyên không dấu để sau đó sẽ được chuyển thành một số nguyên không dấu và giá trị mà kết quả cuối cùng sẽ có là (UINT_MAX + 1) - 4444.
Nếu độ chính xác của int unsign lớn hơn int int, int int đã ký sẽ được thăng cấp thành int unsign mang lại giá trị (UINT_MAX + 1) - 5678 sẽ được thêm vào int 1234 không dấu khác. các giá trị khác, làm cho biểu thức nằm ngoài phạm vi {0..UINT_MAX}, giá trị (UINT_MAX + 1) sẽ được thêm hoặc trừ cho đến khi kết quả DOES nằm trong phạm vi {0..UINT_MAX) và sẽ không xảy ra hành vi không xác định nào .
Độ chính xác là gì?
Số nguyên có bit đệm, bit ký và bit giá trị. Số nguyên không dấu không có một dấu hiệu rõ ràng. Char chưa ký được đảm bảo hơn nữa để không có bit đệm. Số lượng bit giá trị mà một số nguyên có độ chính xác là bao nhiêu.
[Gotchas]
Không thể sử dụng macro sizeof macro để xác định độ chính xác của số nguyên nếu có các bit đệm. Và kích thước của một byte không phải là một octet (tám bit) như được định nghĩa bởi C99.
[1] Tràn có thể xảy ra tại một trong hai điểm. Hoặc trước khi bổ sung (trong thời gian khuyến mãi) - khi bạn có một số nguyên không dấu quá lớn để phù hợp với một số nguyên. Việc tràn cũng có thể xảy ra sau khi bổ sung ngay cả khi int unsign nằm trong phạm vi của int, sau khi bổ sung, kết quả vẫn có thể bị tràn.