Форум программистов, компьютерный форум CyberForum.ru

Как в signed char помещается диапазон -128,127 ведь если 127 это 01111111, то -127 должно быть 11111111 - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 4.71
h3mbr0
8 / 8 / 0
Регистрация: 12.03.2012
Сообщений: 125
29.08.2012, 22:41     Как в signed char помещается диапазон -128,127 ведь если 127 это 01111111, то -127 должно быть 11111111 #1
Добрый вечер! ломаю голову над тем, как в signed char помещается диапазон -128,127 ведь если 127 это 01111111, то -127 должно быть 11111111, а чему же тогда равно -128 в binary?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.08.2012, 22:41     Как в signed char помещается диапазон -128,127 ведь если 127 это 01111111, то -127 должно быть 11111111
Посмотрите здесь:

C++ Вывод символов выше 127 (математические, немецкие и т.п)
C++ Разница между char и signed char
C++ Значения типов данных (signed, unsigned, char)
C++ Определить число полученное выписыванием в обратном порядке цифр заданного треьохзначного числа(721-127)
C++ 8-битовый тип signed char может представлять значения от -128 до 127
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
29.08.2012, 22:43     Как в signed char помещается диапазон -128,127 ведь если 127 это 01111111, то -127 должно быть 11111111 #2
-128 и не входит
диапозон -127,0,+127
Bash
1
2
3
4
5
- 127  - 11111111
- 1    - 10000001
  0    - 00000000
  1    - 00000001
  127  - 01111111
h3mbr0
8 / 8 / 0
Регистрация: 12.03.2012
Сообщений: 125
29.08.2012, 22:46  [ТС]     Как в signed char помещается диапазон -128,127 ведь если 127 это 01111111, то -127 должно быть 11111111 #3
Спасибо. Знакомый недавно упорно доказывал что во все signed входит отрицательное число равное числу старшего бита
Veyron
 Аватар для Veyron
104 / 104 / 4
Регистрация: 02.06.2009
Сообщений: 579
29.08.2012, 22:48     Как в signed char помещается диапазон -128,127 ведь если 127 это 01111111, то -127 должно быть 11111111 #4
alex_x_x, да ты что? Загляни сюда тогда.
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
29.08.2012, 22:51     Как в signed char помещается диапазон -128,127 ведь если 127 это 01111111, то -127 должно быть 11111111 #5
Цитата Сообщение от Veyron Посмотреть сообщение
alex_x_x, да ты что? Загляни сюда тогда.
ну да, иначе был бы +0 и -0
Герц
523 / 340 / 4
Регистрация: 05.11.2010
Сообщений: 1,077
Записей в блоге: 1
29.08.2012, 22:52     Как в signed char помещается диапазон -128,127 ведь если 127 это 01111111, то -127 должно быть 11111111 #6
Мало того, что 1111 1111 это не -127, а -1, -128 входит в этот диапазон и представляется значением 1000 0000.
Чтобы получить преобразовать дополнительный код в прямой, нужно проинвертировать все биты в абсолютном значении числа и прибавить единицу
Veyron
 Аватар для Veyron
104 / 104 / 4
Регистрация: 02.06.2009
Сообщений: 579
29.08.2012, 22:53     Как в signed char помещается диапазон -128,127 ведь если 127 это 01111111, то -127 должно быть 11111111 #7
h3mbr0, пример в Вашем первом посте демонстрирует другой формат представления данных (прямой код со знаковым битом). На практике используют дополнительный код, так как удобно складывать отрицательные и положительные числа в этом случае.
Герц
523 / 340 / 4
Регистрация: 05.11.2010
Сообщений: 1,077
Записей в блоге: 1
29.08.2012, 22:57     Как в signed char помещается диапазон -128,127 ведь если 127 это 01111111, то -127 должно быть 11111111 #8
ломаю голову над тем, как в signed char помещается диапазон -128,127
А в чем проблема? char представляет 256 различных значений, диапазон -128;127 содержит ровно 256 различных значений. А -127;127 только 255.
h3mbr0
8 / 8 / 0
Регистрация: 12.03.2012
Сообщений: 125
29.08.2012, 23:00  [ТС]     Как в signed char помещается диапазон -128,127 ведь если 127 это 01111111, то -127 должно быть 11111111 #9
Цитата Сообщение от Veyron Посмотреть сообщение
h3mbr0, пример в Вашем первом посте демонстрирует другой формат представления данных (прямой код со знаковым битом). На практике используют дополнительный код, так как удобно складывать отрицательные и положительные числа в этом случае.
Можно поподробнее? никогда с битами не встречался, но ведь программист не умеющий работать с битами не программист, вот я и решил за них взяться, из того что вычитал - знаю только о таком представлении

Добавлено через 2 минуты
Использую такой код для вычисления двоичного числа:
C++
1
2
3
4
5
6
7
8
9
template<typename T>
void dec2bin(const T &d)
{
    d<0 && exit(1);
    cout << "\ndec - " << short(d) << "\nbin - ";
    for (int i=sizeof(T)*8-1; i>=0; i--)
        cout << (d>>i)%2;
    cout << endl;
}
правда работает он только с unsigned. А как представить то же число в дополнительном коде?
Veyron
 Аватар для Veyron
104 / 104 / 4
Регистрация: 02.06.2009
Сообщений: 579
29.08.2012, 23:12     Как в signed char помещается диапазон -128,127 ведь если 127 это 01111111, то -127 должно быть 11111111 #10
h3mbr0, все положительные числа и ноль в любом коде выглядят одинаково.
В прямом коде отрицательное число - положительное число со знаковым битом.
В обратном коде отрицательное число - дополнение до положительного (обращаем все биты).
В дополнительном коде отрицательное число - дополнение до положительного плюс единица.

Подробнее можно почитать в интернете, конкретно в википедии статьи о прямом, обратном и дополнительном коде.
h3mbr0
8 / 8 / 0
Регистрация: 12.03.2012
Сообщений: 125
29.08.2012, 23:25  [ТС]     Как в signed char помещается диапазон -128,127 ведь если 127 это 01111111, то -127 должно быть 11111111 #11
Цитата Сообщение от Veyron Посмотреть сообщение
h3mbr0, все положительные числа и ноль в любом коде выглядят одинаково.
В прямом коде отрицательное число - положительное число со знаковым битом.
В обратном коде отрицательное число - дополнение до положительного (обращаем все биты).
В дополнительном коде отрицательное число - дополнение до положительного плюс единица.

Подробнее можно почитать в интернете, конкретно в википедии статьи о прямом, обратном и дополнительном коде.
Спасибо за пояснение. А есть способ распечатать число в этом самом дополнительном коде?
Герц
523 / 340 / 4
Регистрация: 05.11.2010
Сообщений: 1,077
Записей в блоге: 1
29.08.2012, 23:33     Как в signed char помещается диапазон -128,127 ведь если 127 это 01111111, то -127 должно быть 11111111 #12
все signed типы хранятся в дополнительном коде, нужно лишь вывести их побитно.
h3mbr0
8 / 8 / 0
Регистрация: 12.03.2012
Сообщений: 125
29.08.2012, 23:38  [ТС]     Как в signed char помещается диапазон -128,127 ведь если 127 это 01111111, то -127 должно быть 11111111 #13
Цитата Сообщение от Герц Посмотреть сообщение
все signed типы хранятся в дополнительном коде, нужно лишь вывести их побитно.
Меня и интересует как вывести их побитно)
Герц
523 / 340 / 4
Регистрация: 05.11.2010
Сообщений: 1,077
Записей в блоге: 1
29.08.2012, 23:50     Как в signed char помещается диапазон -128,127 ведь если 127 это 01111111, то -127 должно быть 11111111 #14
C++
1
2
3
4
5
    int a = -2;
    for ( int i = 8 * sizeof( a ) - 1; i >= 0; --i ) {
        std::cout << ( ( a >> i ) & 1 );
    }
    return 0;
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
30.08.2012, 00:59     Как в signed char помещается диапазон -128,127 ведь если 127 это 01111111, то -127 должно быть 11111111 #15
C++
1
2
3
4
5
6
7
8
9
10
#include <bitset>
#include <iostream>
 
template <typename T> void print (const T& value) {
  std::cout << std::bitset<sizeof(T) * 8> (value) << std::endl;
}
 
int main () {
  print ((signed char)-127);
}
правда я не уверен насчет стандартности

Добавлено через 1 минуту
не, таки есть
template <class charT, class traits, size_t N>
basic_ostream<charT, traits>&
operator<<(basic_ostream<charT, traits>& os, const bitset<N>& x);
-=ЮрА=-
30.08.2012, 01:27
  #16

Не по теме:

Цитата Сообщение от alex_x_x Посмотреть сообщение
-128 и не входит
диапозон -127,0,+127
Код Bash
- 127 *- 11111111
- 1 * *- 10000001
* 0 * *- 00000000
* 1 * *- 00000001
* 127 *- 01111111
- calc.exe считает 11111111 как 255 (так просто к слову)
Немножко не в ту степь, но для прикола сойдёт
http://liveworkspace.org/code/ce5a8f...4d008f8b36cb76

Герц
523 / 340 / 4
Регистрация: 05.11.2010
Сообщений: 1,077
Записей в блоге: 1
30.08.2012, 01:33     Как в signed char помещается диапазон -128,127 ведь если 127 это 01111111, то -127 должно быть 11111111 #17
Дело в том, что у calc'a 64-битное целое, поэтому чтобы получить -1 надо ввести 64 двоичных единицы.
А теперь попробуйте ввести -1 в десятичной системе счисления и посмотрите на результат - там будут те же самые 11111111 (с поправкой на разрядность целочисленного типа, у калькулятора 8-байтовые целые, а мы тут говорили об однобайтовых char'ах).
-=ЮрА=-
30.08.2012, 01:43
  #18

Не по теме:

Герц,

Цитата Сообщение от Герц Посмотреть сообщение
А теперь попробуйте ввести -1 в десятичной системе счисления и посмотрите на результат - там будут те же самые 11111111
-1 в бинарке от calc.exe
1111111111111111111111111111111111111111111111111111111111111111

alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
30.08.2012, 01:46     Как в signed char помещается диапазон -128,127 ведь если 127 это 01111111, то -127 должно быть 11111111 #19
-=ЮрА=-, так это к началу темы (то о чем я уже позабыл) - есть разные формы представления отрицательных двоичных чисел
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.08.2012, 02:08     Как в signed char помещается диапазон -128,127 ведь если 127 это 01111111, то -127 должно быть 11111111
Еще ссылки по теме:

Диапазон чисел - вывести по порядку, указывая сколько строк должно быть C++
C++ Что означает сообщение компилятора code block Process terminated with status 127
Как понять следующую запись (signed char const ix(delta_x > 0) - (delta_x < 0)? C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Герц
523 / 340 / 4
Регистрация: 05.11.2010
Сообщений: 1,077
Записей в блоге: 1
30.08.2012, 02:08     Как в signed char помещается диапазон -128,127 ведь если 127 это 01111111, то -127 должно быть 11111111 #20
-=ЮрА=-, то что в скобках написано ты видимо не прочел?
Выбери "1 байт" чекбокс в левом нижнем углу калькулятора.
Yandex
Объявления
30.08.2012, 02:08     Как в signed char помещается диапазон -128,127 ведь если 127 это 01111111, то -127 должно быть 11111111
Ответ Создать тему
Опции темы

Текущее время: 00:50. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru