Здравствуйте, гость ( Вход | Регистрация )
![]() ![]() |
|
Litkevich Yuriy |
21.4.2010, 10:40
Сообщение
#1
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: 94
|
столкнулся со странным поведением компилятора. Имеется код:
откуда берутся старшие FF'ки?
|
|
|
|
|
Tonal |
21.4.2010, 10:50
Сообщение
#2
|
![]() Активный участник ![]() ![]() ![]() Группа: Участник Сообщений: 452 Регистрация: 6.12.2007 Из: Новосибирск Пользователь №: 34 Спасибо сказали: 69 раз(а) Репутация: 17
|
Похоже для твоего компилятора/платформы char - знаковый тип.
Т. е. то что тебе нужно получится таким образом:
|
|
|
|
|
Iron Bug |
21.4.2010, 11:19
Сообщение
#3
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Модератор Сообщений: 1611 Регистрация: 6.2.2009 Из: Yekaterinburg Пользователь №: 533 Спасибо сказали: 219 раз(а) Репутация: 12
|
Цитата(Litkevich Yuriy @ 21.4.2010, 13:40) Link столкнулся со странным поведением компилятора. Имеется код: откуда берутся старшие FF'ки?просто объяви массив как unsigned char. иначе у тебя значение 0xF8 компилер рассматривает как отрицательное и вполне логично переводит его в отрицательное же int'овское число. |
|
|
|
|
Litkevich Yuriy |
21.4.2010, 11:23
Сообщение
#4
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: 94
|
Цитата(Tonal @ 21.4.2010, 14:50) Link char - знаковый тип да это так. Сейчас я сделал предварительное приведение к unsigned char, но я не понял, почему на прямки к unsigned int нельзя привести.Цитата(Iron Bug @ 21.4.2010, 15:19) Link и вполне логично переводит его в отрицательное же int'овское число. вот для меня не логично, можешь объяснить?Полчается что перед явным приведением к unsigned int происходит ещё какое-то неявное приведение? Т.е. первая строка присваивания для меня вполне ожидаемый вариант дала, а вот вторая нет |
|
|
|
|
Iron Bug |
21.4.2010, 14:23
Сообщение
#5
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Модератор Сообщений: 1611 Регистрация: 6.2.2009 Из: Yekaterinburg Пользователь №: 533 Спасибо сказали: 219 раз(а) Репутация: 12
|
Цитата(Litkevich Yuriy @ 21.4.2010, 14:23) Link Цитата(Iron Bug @ 21.4.2010, 15:19) Link и вполне логично переводит его в отрицательное же int'овское число. вот для меня не логично, можешь объяснить?типы char и short в С++ всегда приводятся к типу int при выполнении операций(widening). причём, если их значение помещается в signed int - то используется этот тип, и только если оно превышает возможности типа signed int, значение переводится в unsigned int. в данном случае 0xF8 вполне помещается в signed int и перед выполнением операции приведения типов производится "расширение" типа char к типу signed int, а уже к нему применяется операция приведения. |
|
|
|
![]() ![]() ![]() |
|
Текстовая версия | Сейчас: 23.12.2025, 22:48 |