Tôi đã mong đợi điều này để in một số lượng rất lớn và cùng một số -1 nhưng nó chỉ in -1 và -2, tại sao điều này?c tại sao điều này in một số âm?
fprintf(stderr, "%d\n", 0xffffffff);
fprintf(stderr, "%d\n", 0xfffffffe);
Tôi đã mong đợi điều này để in một số lượng rất lớn và cùng một số -1 nhưng nó chỉ in -1 và -2, tại sao điều này?c tại sao điều này in một số âm?
fprintf(stderr, "%d\n", 0xffffffff);
fprintf(stderr, "%d\n", 0xfffffffe);
Định dạng %d
là số nguyên có dấu (thập phân). Số nguyên được lưu trữ bằng cách sử dụng two's complement, có nghĩa là bit thứ tự cao (8000 0000) cho biết, theo cách nói, dấu hiệu của giá trị.
Đếm ngược từ 3, giá trị là:
0000 0003 = 3
0000 0002 = 2
0000 0001 = 1
0000 0000 = 0
FFFF FFFF = -1
FFFF FFFE = -2
, vv
Nếu bạn muốn FFFF FFFF để hiển thị như một số dương lớn, sử dụng định dạng %u
(unsigned).
Các giá trị bạn đề cập đến là đại diện bổ sung của hai trong số -1 và -2
Tra cứu two's complement
Các bit đầu tiên trên một số nguyên ký là dấu hiệu, vì vậy số lượng cao nhất có thể được lưu trữ là 0xEFFFFFFF.
Đối số "% d" in đầu vào dưới dạng số nguyên đã ký. Do đó, bạn đã phát hiện ra two's complement representation, thay vào đó hãy xem xét "% u".
oh,% là bao lâu? hoặc chưa ký? – user105033
% u - chỉ cần thêm vào phản hồi :) –
int là% d, unsigned là% u, long int là% ld, dài unsigned là% lu –