Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Объясните почему?!  (Прочитано 12807 раз)
0 Пользователей и 1 Гость смотрят эту тему.
AlexCasual
Помогающий

by
Offline Offline

« : 14-09-2011 18:48 » 

char b = 0xC0 - почему это -64,а не 192?
« Последнее редактирование: 14-09-2011 19:01 от AlexCasual » Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #1 : 14-09-2011 18:50 » 

знаковое жеж!

пиши
 unsigned char b = 0xC0;

но содержимое то всё равно было правильное
Записан

Dale
Блюзмен
Команда клуба

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #2 : 14-09-2011 18:51 » 

Стандартом C не определено, является ли тип char знаковым. Зависит от реализации. В данном случае, значит, разработчики решили, что char == signed char.
Записан

Всего лишь неделя кодирования с последующей неделей отладки могут сэкономить целый час, потраченный на планирование программы. - Дж. Коплин.

Ходить по воде и разрабатывать программное обеспечение по спецификациям очень просто, когда и то, и другое заморожено. - Edward V. Berard

Любые проблемы в информатике решаются добавлением еще одного уровня косвенности – кроме, разумеется, проблемы переизбытка уровней косвенности. — Дэвид Уилер.
AlexCasual
Помогающий

by
Offline Offline

« Ответ #3 : 14-09-2011 19:07 » 

Тогда как быть?- есть указатель типа char* на буффер,я в нём ищу символ 0хС0:
Код:
for(size_t i=0;i<len;++i)
{
   if(buffer[i] == 0xC0)
    break;                    <------------  сюда никогда не попадаю,потому что получается buffer[i] = -64
}
Код:
for(size_t i=0;i<len;++i)
{
   if(buffer[i] == -64)
    break;                    <------------  сюда попадаю!
}
Записан
PredatorAlpha
Помогающий

us
Offline Offline

« Ответ #4 : 14-09-2011 19:12 » 

Приведи 0xC0 к типу char
if(buffer == (char)0xC0) для C
или
if(buffer == static_cast<char>(0xC0) ) для C++
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #5 : 14-09-2011 19:26 » 

а так красивше Улыбаюсь

if(buffer == char(0xC0) )
Записан

AlexCasual
Помогающий

by
Offline Offline

« Ответ #6 : 14-09-2011 19:27 » 

А можно ли так? - if(buffer == 'À',где À - код для 0хС0,что лучше - с кастами или так?
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #7 : 14-09-2011 19:28 » 

 if(buffer == 'À')

 это идеальный вариант
Записан

PredatorAlpha
Помогающий

us
Offline Offline

« Ответ #8 : 14-09-2011 19:36 » 

а так красивше Улыбаюсь

if(buffer == char(0xC0) )
В классическом С не сработает. А в С++ некоторые сторонники чистоты приведения типов за такое и надругаться над тобой могут.
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #9 : 14-09-2011 19:40 » 

PredatorAlpha, я про C++ говорю , а на "сторонников чистоты" я клал Улыбаюсь
Записан

PredatorAlpha
Помогающий

us
Offline Offline

« Ответ #10 : 14-09-2011 19:46 » 

Раздел, где расположена тема, называется  С/С++ . Вопрошающий не уточнил, на каком языке он пишет. Потому я дал оба варианта.
А вот отношение к сторонникам чистоты считаю очень даже конструктивным! Улыбаюсь
Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #11 : 15-09-2011 06:07 » 

А можно ли так? - if(buffer == 'À',где À - код для 0хС0,что лучше - с кастами или так?

А я не рекомендую так делать. Слишком легко ошибиться, т.к. визуально почти не отличается от "A" (0x41) и в другой кодировке коду 0xC0 может соответствовать другой символ.
Также подумай, какой будет код, если исходник будет в UTF-8...
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Dale
Блюзмен
Команда клуба

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #12 : 15-09-2011 06:24 » 

А можно ли так? - if(buffer == 'À',где À - код для 0хС0,что лучше - с кастами или так?

Код на C пишется для человека, компьютеру он без надобности. Хороший код должен максимально ясно выражать намерения программиста без чтения комментариев и разгадывания ребусов.

Если в данном конкретном случае вашей задачей было найти именно литеру 'À' в массиве, то вариант с 'À' однозначно лучше. Если же требуется найти байт 0хС0, то без вариантов лучше 0хС0. Учитывайте, что читатель программы вряд ли заучивает наизусть таблицы расширенных кодировок для всех мыслимых кодовых страниц.
Записан

Всего лишь неделя кодирования с последующей неделей отладки могут сэкономить целый час, потраченный на планирование программы. - Дж. Коплин.

Ходить по воде и разрабатывать программное обеспечение по спецификациям очень просто, когда и то, и другое заморожено. - Edward V. Berard

Любые проблемы в информатике решаются добавлением еще одного уровня косвенности – кроме, разумеется, проблемы переизбытка уровней косвенности. — Дэвид Уилер.
AlexCasual
Помогающий

by
Offline Offline

« Ответ #13 : 26-09-2011 07:49 » 

Массив символов data в кодировке UTF-8 :

if((data[it] != static_cast<char>(0xC0))&&(data[it + 1] != static_cast<char>(0x80)))
{
   A; --------------------> попадаем сюда,когда передаётся русская "р",код - 0xd1 0x80
}

if((data[it] == static_cast<char>(0xC0))&&(data[it + 1] == static_cast<char>(0x80)))
{
   B; --------------------> попадаем сюда только когда передаётся 0xC0 0x80
}

Я вообще чего-то серьёзно недопонимаю...
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #14 : 26-09-2011 16:37 » new

а что хочешь сделать то ?

Предлагаю сначала переконвертить из UTF8 в ASCII или UNICODE , а потом сравнивать преспокойно
Записан

Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines