Необъяснимое поведение

Рейтинг: 2Ответов: 1Опубликовано: 20.12.2014
sourcePicture - объект класса CImage
cout << sourcePicture.GetPitch();             //выводит -2100
cout << sizeof(bgr);                          //выводит 3
cout << sourcePicture.GetPitch()/3;           //выводит -700
cout << sourcePicture.GetPitch()/sizeof(bgr); //выводит 14543789234

Какого чёрта?

Ответы

▲ 3Принят

Всё очень просто. Следите за типами выражения.

Тип sourcePicture.GetPitch(), судя по всему, signed int. Тип константы 3 есть int, и судя по всему, на вашем компиляторе int есть signed int. Согласно правилам, при делении signed int на signed int тип результат — тоже signed int.

Теперь, тип выражения sizeof(bgr)unsigned int. При делении, согласно тем же правилам, происходит конверсия делимого к unisigned int. Следовательно, результат должен быть такой:

(unsigned int)(-2100) / (unsigned int)3 = 4294965196 / 3 = 1431655065

Проверьте ваш результат, вы пишете 14543789234.