Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Неправильный вывод значения (unsigned, ~) 
V
    Опции темы
n199a
  Дата 23.7.2013, 16:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 129
Регистрация: 17.11.2011

Репутация: нет
Всего: нет



Как известно, тип unsigned - целое, без знака, от 0 и выше.
Почему тогда после применения оператора побитового отрицания ~, b = -17 ?

Код

#include <stdio.h>
main() {
    unsigned int a, b;
    a = 0x10;
    printf("a = %d\n", a);
    b = ~a;
    printf("b = %d\n", b);
}

/* 0x10 (двоичн.) = 00010000 (шест.) = 16 (дес.)
 * после использования ОПЕРАТОРА ПОБИТОВОГО ОТРИЦАНИЯ, который 
 * превращает каждый бит переменной в свою противоположность,
 * получится:
 * 00010000 (шест.) = 11101111 (шест.) = 239 (дес.)
 */


PM MAIL   Вверх
baldina
Дата 23.7.2013, 16:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 15
Всего: 101



printf выводит в соответствии со спецификацией формата, а не типа аргументов (который может быть любым).
вы использовали %d, что означает знаковое целое
Код

printf("b = %u\n", b);

PM MAIL   Вверх
n199a
Дата 23.7.2013, 17:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 129
Регистрация: 17.11.2011

Репутация: нет
Всего: нет



Код

printf("b = %u\n", b);

Теперь b = 4294967279, должно получиться b = 239
PM MAIL   Вверх
baldina
Дата 23.7.2013, 17:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 15
Всего: 101



Цитата(n199a @  23.7.2013,  17:03 Найти цитируемый пост)
должно получиться b = 239 

с какой стати? вот если бы оно было размером с байт (8 бит), то  - да. а оно, хе-хе, раза в 4 длиннее
PM MAIL   Вверх
n199a
Дата 23.7.2013, 17:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 129
Регистрация: 17.11.2011

Репутация: нет
Всего: нет



Цитата(baldina @  23.7.2013,  17:08 Найти цитируемый пост)
с какой стати? вот если бы оно было размером с байт (8 бит), то  - да. а оно, хе-хе, раза в 4 длиннее 

int = 4 байт = 32 бит
Я запутался ...
00010000 после "трансформации" получается 11101111, и если 11101111 в калькуляторе перевести в дес., то получится 239

Это сообщение отредактировал(а) n199a - 23.7.2013, 17:16
PM MAIL   Вверх
baldina
Дата 23.7.2013, 17:18 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 15
Всего: 101



http://ideone.com/KQ79GB

Добавлено @ 17:20
в '00010000' не 32 а 8 бит, не так ли? а калькулятор, видимо, работает не с int, а с введенным количеством бит (возможно, выровненным до 8)

Добавлено через 4 минуты и 7 секунд
Код

/* 0x10 (двоичн.) = 00000000 00000000 00000000 00010000 (шест.) = 16 (дес.)
 * после использования ОПЕРАТОРА ПОБИТОВОГО ОТРИЦАНИЯ, который 
 * превращает каждый бит переменной в свою противоположность,
 * получится:
 * 00000000 00000000 00000000 00010000 (шест.) = 11111111 11111111 11111111 11101111 (шест.) = 4294967279 (дес.)
 */


Это сообщение отредактировал(а) baldina - 23.7.2013, 17:20
PM MAIL   Вверх
n199a
Дата 23.7.2013, 17:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 129
Регистрация: 17.11.2011

Репутация: нет
Всего: нет



Цитата(baldina @  23.7.2013,  17:18 Найти цитируемый пост)
в '00010000' не 32 а 8 бит, не так ли? а калькулятор, видимо, работает не с int а с введенным тем количеством бит (возможно, выровненным до 8)


В int 32 бита. Я присвоил a число в 8 бит.
Тип int = 4 байт = 32 бита:
000000000000000000000000000000000000000000 (32 бита)
Присвоенно число переменной а занимает 8 бит. После того, как "положили" a в int, получилось:
00010000 (8 бит)
Получится так:
000000000000000000000000000000000000010000
После использования оператора побитового отрицания(~), полчится:
11111111111111111111111111101111
Что, в свою очередь, равно десятичному 4294967279

Я правльно решил?

Это сообщение отредактировал(а) n199a - 23.7.2013, 17:30
PM MAIL   Вверх
baldina
Дата 23.7.2013, 17:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 15
Всего: 101



да

Добавлено @ 17:34
Цитата(n199a @  23.7.2013,  17:28 Найти цитируемый пост)
Оставшиеся 24 бита

ну только они не оставшиеся. почему вы делите 32 на 24 и 8? они все вместе инвертируются. точнее, каждый из них

Добавлено @ 17:37
Цитата(n199a @  23.7.2013,  17:28 Найти цитируемый пост)
Я присвоил a число в 8 бит. Оставшиеся 24 бита превращаются в 0 или в 1 ?

а, я не внимательно читал. не было присваивания 8 бит. 0x10 это не 8 бит, а int.
 значит двоичное представление 0x10  это 00000000 00000000 00000000 00010000 (если int 32-битный) 

Это сообщение отредактировал(а) baldina - 23.7.2013, 17:38
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0500 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.