WedX - журнал о программировании и компьютерных науках

Приведение char со значением 255 приводит к значению unsigned int 4294967295, что дает?

Хорошо, это странная проблема, с которой я никогда раньше не сталкивался:

#include <iostream>
int main()
{
  char testchar = 255;
  std::cout << (unsigned int)testchar << std::endl;
}

Выход:

4294967295

Что, черт возьми? Кажется, что поскольку char "полный", когда он генерирует новый тип unsigned int, результат также "полный". Это не тот результат, который я помню или ожидаю. Я ожидаю, что unsigned int будет иметь значение 0x000000FF. Может ли кто-нибудь объяснить мне, что именно здесь происходит?

Система: Ubuntu 12.04 64-битная

версия г++: 4.6.3

05.11.2012

  • Изменил заголовок вопроса, чтобы он был более конкретным, чтобы помочь людям, которые ищут. 05.11.2012

Ответы:


1

Ваш char, по-видимому, подписан. Это означает, что 255 переполняет char. Поскольку вы, по-видимому, находитесь на машине с дополнением до 2, битовый шаблон 255 сохраняется в char (т. Е. Все биты установлены). При интерпретации как 8-битное число со знаком это -1.

Затем это значение расширяется по знаку до 32-битного int, что дает 32 1 бита (но то же самое значение, -1). Наконец, это значение преобразуется в unsigned int. Согласно правилам, это делается путем сокращения по модулю 232-1, что дает максимально возможное 32-битное число (4294967295).

05.11.2012
  • When a signed integer is converted to an unsigned integer with equal or greater size, if the value of the signed integer is nonnegative, its value is unchanged. Otherwise: if the unsigned integer has greater size, the signed integer is first promoted to the signed integer corresponding to the unsigned integer; the value is converted to unsigned by adding to it one greater than the largest number that can be represented in the unsigned integer type. цитата из flash-gordon.me.uk/ansi.c.txt 05.11.2012
  • Прошло много времени с тех пор, как я кодировал на C. Я никогда не думал, что char будет подписан по умолчанию - для меня это не имеет особого смысла. Теперь у меня проблемы с определением указателей на беззнаковые символы sigh Что ж, спасибо за ответ! 05.11.2012
  • @Githlar: Может быть, вы просто хотите сначала выполнить приведение к unsigned char, а затем к unsigend int. 05.11.2012
  • Новые материалы

    Как создать диаграмму градиентной кисти с помощью D3.js
    Резюме: Из этого туториала Вы узнаете, как добавить градиентную кисть к диаграмме с областями в D3.js. Мы добавим градиент к значениям SVG и применим градиент в качестве заливки к диаграмме с..

    Я хотел выучить язык программирования MVC4, но не мог выучить его раньше, потому что это выглядит сложно…
    Просто начните и учитесь самостоятельно Я хотел выучить язык программирования MVC4, но не мог выучить его раньше, потому что он кажется мне сложным, и я бросил его. Это в основном инструмент..

    Лицензии с открытым исходным кодом: руководство для разработчиков и создателей
    В динамичном мире разработки программного обеспечения открытый исходный код стал мощной парадигмой, способствующей сотрудничеству, инновациям и прогрессу, движимому сообществом. В основе..

    Объяснение документов 02: BERT
    BERT представил двухступенчатую структуру обучения: предварительное обучение и тонкая настройка. Во время предварительного обучения модель обучается на неразмеченных данных с помощью..

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

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..


    Для любых предложений по сайту: [email protected]