crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> явное и неявное преобразование встроенных типов
Litkevich Yuriy
  опции профиля:
сообщение 21.4.2010, 10:40
Сообщение #1


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


столкнулся со странным поведением компилятора. Имеется код:
char theBuffer[N];
// theBuffer[i] содержит 0xF8

word = theBuffer[i]; // word содержит 0xFFFFFF8F
word = (unsigned int)theBuffer[i]; // word содержит 0xFFFFFF8F
откуда берутся старшие FF'ки?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Tonal
  опции профиля:
сообщение 21.4.2010, 10:50
Сообщение #2


Активный участник
***

Группа: Участник
Сообщений: 452
Регистрация: 6.12.2007
Из: Новосибирск
Пользователь №: 34

Спасибо сказали: 69 раз(а)




Репутация:   17  


Похоже для твоего компилятора/платформы char - знаковый тип.
Т. е. то что тебе нужно получится таким образом:
word = static_cast<unsigned char>(theBuffer[i]);
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Iron Bug
  опции профиля:
сообщение 21.4.2010, 11:19
Сообщение #3


Профессионал
*****

Группа: Модератор
Сообщений: 1609
Регистрация: 6.2.2009
Из: Yekaterinburg
Пользователь №: 533

Спасибо сказали: 219 раз(а)




Репутация:   12  


Цитата(Litkevich Yuriy @ 21.4.2010, 13:40) *
столкнулся со странным поведением компилятора. Имеется код:
char theBuffer[N];
// theBuffer[i] содержит 0xF8

word = theBuffer[i]; // word содержит 0xFFFFFF8F
word = (unsigned int)theBuffer[i]; // word содержит 0xFFFFFF8F
откуда берутся старшие 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) *
char - знаковый тип
да это так. Сейчас я сделал предварительное приведение к unsigned char, но я не понял, почему на прямки к unsigned int нельзя привести.

Цитата(Iron Bug @ 21.4.2010, 15:19) *
и вполне логично переводит его в отрицательное же int'овское число.
вот для меня не логично, можешь объяснить?
Полчается что перед явным приведением к unsigned int происходит ещё какое-то неявное приведение?

Т.е. первая строка присваивания для меня вполне ожидаемый вариант дала, а вот вторая нет
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Iron Bug
  опции профиля:
сообщение 21.4.2010, 14:23
Сообщение #5


Профессионал
*****

Группа: Модератор
Сообщений: 1609
Регистрация: 6.2.2009
Из: Yekaterinburg
Пользователь №: 533

Спасибо сказали: 219 раз(а)




Репутация:   12  


Цитата(Litkevich Yuriy @ 21.4.2010, 14:23) *
Цитата(Iron Bug @ 21.4.2010, 15:19) *
и вполне логично переводит его в отрицательное же int'овское число.
вот для меня не логично, можешь объяснить?


типы char и short в С++ всегда приводятся к типу int при выполнении операций(widening). причём, если их значение помещается в signed int - то используется этот тип, и только если оно превышает возможности типа signed int, значение переводится в unsigned int.
в данном случае 0xF8 вполне помещается в signed int и перед выполнением операции приведения типов производится "расширение" типа char к типу signed int, а уже к нему применяется операция приведения.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 4.7.2022, 11:54