Tôi đã lần ra một con bọ cực kỳ khó chịu ẩn sau viên ngọc nhỏ này. Tôi biết rằng theo thông số C ++, tràn có dấu là hành vi không xác định, nhưng chỉ khi tràn xảy ra khi giá trị được mở rộng đến chiều rộng bit sizeof(int). Theo tôi hiểu, việc tăng một charkhông bao giờ nên là hành vi không xác định miễn là sizeof(char) < sizeof(int). Nhưng điều đó không giải thích được cách cnhận được một giá trị bất khả thi . Là một số nguyên 8 bit, làm thế nào có thể cgiữ các giá trị lớn hơn chiều rộng bit của nó?
Mã
// Compiled with gcc-4.7.2
#include <cstdio>
#include <stdint.h>
#include <climits>
int main()
{
int8_t c = 0;
printf("SCHAR_MIN: %i\n", SCHAR_MIN);
printf("SCHAR_MAX: %i\n", SCHAR_MAX);
for (int32_t i = 0; i <= 300; i++)
printf("c: %i\n", c--);
printf("c: %i\n", c);
return 0;
}
Đầu ra
SCHAR_MIN: -128
SCHAR_MAX: 127
c: 0
c: -1
c: -2
c: -3
...
c: -127
c: -128 // <= The next value should still be an 8-bit value.
c: -129 // <= What? That's more than 8 bits!
c: -130 // <= Uh...
c: -131
...
c: -297
c: -298 // <= Getting ridiculous now.
c: -299
c: -300
c: -45 // <= ..........
Kiểm tra nó trên Ideone.
printf()để chuyển đổi?