Như chúng ta biết, tràn số nguyên có dấu là hành vi không xác định . Nhưng có điều gì đó thú vị trong cstdint
tài liệu C ++ 11 :
kiểu số nguyên có dấu với độ rộng chính xác 8, 16, 32 và 64 bit tương ứng không có bit đệm và sử dụng phần bù của 2 cho các giá trị âm (chỉ được cung cấp nếu việc triển khai hỗ trợ trực tiếp kiểu)
Và đây là câu hỏi của tôi: kể từ khi tiêu chuẩn nói rõ ràng rằng int8_t
, int16_t
, int32_t
và int64_t
số âm là 2 của bổ sung, vẫn còn tràn của các loại một hành vi không xác định?
Chỉnh sửa Tôi đã kiểm tra Tiêu chuẩn C ++ 11 và C11 và đây là những gì tôi tìm thấy:
C ++ 11, §18.4.1:
Tiêu đề xác định tất cả các chức năng, kiểu và macro giống như 7.20 trong tiêu chuẩn C.
C11, §7.20.1.1:
Tên typedef
intN_t
chỉ định một kiểu số nguyên có dấu với độ rộng N, không có bit đệm và biểu diễn phần bù của hai. Do đó,int8_t
biểu thị một kiểu số nguyên có dấu với độ rộng chính xác là 8 bit.