Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.99/254: Рейтинг темы: голосов - 254, средняя оценка - 4.99
-8 / 1 / 0
Регистрация: 18.10.2011
Сообщений: 36
1

Вывод чисел в двоичном виде

26.10.2012, 12:32. Показов 48238. Ответов 16
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
камрады, добры день. есть проблема с программой, которая выводит числа в двоичном виде.
например, для типов int, сhar, unsigned int выводит (вроде) правильно. а вот long unsigned int выводит как-то странно. например, для числа 1 в бинарном виде получается два бита равны единице.

output:
sizeof(long unsigned int) = 8
sizeof(int) = 4
sizeof(char) = 1
sizeof(unsigned int) = 4
(int) -5
11111111111111111111111111111011
(int) -4
11111111111111111111111111111100
(int) -3
11111111111111111111111111111101
(int) -2
11111111111111111111111111111110
(int) -1
11111111111111111111111111111111
(int) 0
00000000000000000000000000000000
(int) 1
00000000000000000000000000000001
(int) 2
00000000000000000000000000000010
(int) 3
00000000000000000000000000000011
(int) 4
00000000000000000000000000000100
(int) 5
00000000000000000000000000000101
unsigned int 1
00000000000000000000000000000001
char -2
11111110
long unsigned int 1
0000000000000000000000000000000100000000000000000000000000000001



C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#include <stdio.h>
 
 
void bin(long unsigned int k, long unsigned int size)
{
    long unsigned int i;
 
 
    for (i = size * 8; i > 0; --i) {
        printf("%d", (k & (1 << (i-1))) ? 1 : 0);
    }
    printf("\n");
}
 
 
 
 
int
main(void)
{
    long unsigned int lu;
    unsigned int u;
    int i;
    char c;
 
    printf("sizeof(long unsigned int) = %lu\n", sizeof(long unsigned int));
    printf("sizeof(int) = %lu\n", sizeof(int));
    printf("sizeof(char) = %lu\n", sizeof(char));
    printf("sizeof(unsigned int) = %lu\n", sizeof(unsigned int));
    for (i = -5; i < 6; ++i) {
        printf("(int) %i\n", i);
        bin(i, sizeof(i));
    }
    u = 1;
    printf("unsigned int %u\n", u);
    bin(u, sizeof(u));
    c = -2;
    printf("char %d\n", c);
    bin(c, sizeof(c));
    lu = 1;
    printf("long unsigned int %lu\n", lu);
    bin(lu, sizeof(lu));
    return 0;
}

укажите ошибку или объясните мне, почему два бита равны единице для числа long unsigned int lu=1;
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
26.10.2012, 12:32
Ответы с готовыми решениями:

Вывод числа, представленного в десятичной системе, в двоичном виде без циклов и массивов
Дано число в десятичной системе исчисления. Вывести с помощью printf() в двоичную, без циклов и...

Вывод десятичных чисел в двоичном виде
Пытаюсь сделать программу выводящую десятичные числа в двоичной системе. В чем ошибка? При любом...

Вывод числа в двоичном виде
Здравствуйте, вы бы не помгли подсказать, например, дано число в 16-тиричном виде (в DT), а вывести...

Вывод десятичного числа в двоичном виде
Собственно интересно как реализовать вывод десятичного числа в двоичном виде с помощью битовой...

16
Диссидент
Эксперт C
27706 / 17322 / 3812
Регистрация: 24.12.2010
Сообщений: 38,979
26.10.2012, 14:18 2
testsova, ошибку не вижу, но могу предложить немного другой способ
C
1
2
3
4
5
for(i=0; i<8*size; i++) {
 c = (k&1);
 printf("%d", c);
 k = (k>>1);
}
0
-8 / 1 / 0
Регистрация: 18.10.2011
Сообщений: 36
26.10.2012, 14:31  [ТС] 3
благодарю.
но ваш способ меняет порядок бит. мне не по нраву. тем более меня больше уже интересует именно ответ на мой вопрос.
0
Эксперт С++
4985 / 3092 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
26.10.2012, 14:51 4
Не знаю с чем это связано. У меня работает такой вариант:
C
1
2
3
4
5
6
7
8
void bin( unsigned long long k )
{
    for ( int i = 0; i < 64; i++ ) {
        printf( "%d", (k & 0x8000000000000000ULL) ? 1 : 0 );
        k <<= 1;
    }
    printf("\n");
}
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
12458 / 7482 / 1753
Регистрация: 25.07.2009
Сообщений: 13,762
26.10.2012, 15:28 5
Лучший ответ Сообщение было отмечено Памирыч как решение

Решение

lazybiz, как-то не гуманно для значения
C
1
char c = -1;
64 единицы выводить
Вот "универсальный" вариант, но с макросом
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#include <stdio.h>
#include <limits.h>
 
#define bindump(ptr, size) ({ \
    unsigned long n = (size) * CHAR_BIT; \
    while ( n ) \
        printf("%d", ( *(ptr) >> --n ) & 1); \
})
 
int main(void) {
    char c1 = 1, c2 = -1;
    int i1 = 1, i2 = -1;
    long l1 = 1L, l2 = -1L;
    unsigned long ul = 1UL;
    long long ll1 = 1LL, ll2 = -1LL;
    unsigned long long ull = 1ULL;
    
    printf("C1: ");
    bindump(&c1, sizeof(char));
    printf("\nC2: ");
    bindump(&c2, sizeof(char));
    printf("\nI1: ");
    bindump(&i1, sizeof(int));
    printf("\nI2: ");
    bindump(&i2, sizeof(int));
    printf("\nL1: ");
    bindump(&l1, sizeof(long));
    printf("\nL2: ");
    bindump(&l2, sizeof(long));
    printf("\nUL: ");
    bindump(&ul, sizeof(long));
    printf("\nLL1: ");
    bindump(&ll1, sizeof(long long));
    printf("\nLL2: ");
    bindump(&ll2, sizeof(long long));
    printf("\nULL: ");
    bindump(&ull, sizeof(long long));
    printf("\n");
    
    return 0;
}
http://codepad.org/zIaovOv6
0
Эксперт С++
4985 / 3092 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
26.10.2012, 15:38 6
easybudda, это пример исключительно для unsigned long long.
0
-8 / 1 / 0
Регистрация: 18.10.2011
Сообщений: 36
26.10.2012, 21:40  [ТС] 7
Цитата Сообщение от easybudda Посмотреть сообщение
lazybiz, как-то не гуманно для значения
C
1
char c = -1;
64 единицы выводить
Вот "универсальный" вариант, но с макросом
64 единицы не выводится. у меня вторым параметром sizeof

Добавлено через 1 минуту
каждый пришёл, написал свой мега вариант. а по сути самого вопроса?

Добавлено через 6 минут
беглым взгядом: ваши коды выводят число наоборот. это круто, видимо. в прниципе проблема решается вот так: перед единицей, биты которой я сдвигаю влево, можно указать тип:

C
1
printf("%d", (k & ((long unsigned int)1 << (i-1))) ? 1 : 0);
. т.е. константы в выражениях по 32 бита что ли? или как? где можно почитать об этом? спасибо всем.
0
Диссидент
Эксперт C
27706 / 17322 / 3812
Регистрация: 24.12.2010
Сообщений: 38,979
26.10.2012, 21:44 8
Цитата Сообщение от testsova Посмотреть сообщение
ваши коды выводят число наоборот
Вы правы. Выход есть. Помещать цифры в массив, а потом печатать с конца.
0
Эксперт С++
4985 / 3092 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
26.10.2012, 22:04 9
Цитата Сообщение от testsova Посмотреть сообщение
ваши коды выводят число наоборот
Мой нет.
0
-8 / 1 / 0
Регистрация: 18.10.2011
Сообщений: 36
26.10.2012, 22:08  [ТС] 10
Цитата Сообщение от Байт Посмотреть сообщение
Вы правы. Выход есть. Помещать цифры в массив, а потом печатать с конца.
мой код гляньте, мониор протрите.
0
Модератор
Эксперт по электронике
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,521
26.10.2012, 22:21 11
вот у тебя ошибка
Цитата Сообщение от testsova Посмотреть сообщение
(1 << (i-1))
1 приводится к int (32 разряда)
в результате два раза выскакивает 1
надо её объявить как
C++
1
((unsigned long )1 << (i-1))
и будет все в порядке

у меня (VS2008) long равен int (32 разряда)
посему использовал long long (64 разряда)
вот подправленая функция которая работает у меня
C++
1
2
3
4
5
6
7
8
9
10
void bin(long long unsigned int k, long unsigned int size)
{
    long unsigned int i;
 
 
    for (i = size * 8; i > 0; --i) {
        printf("%d", (k & ((unsigned long long)1 << (i-1))) ? 1 : 0);
    }
    printf("\n");
}
можно сделать более развернуто
C++
1
2
3
4
5
6
7
8
9
10
11
void bin(long long unsigned int k, long unsigned int size)
{
    long unsigned int i;
 
 long long unsigned int m=1;
    for (i = size * 8; i > 0; --i) {
      long long unsigned int q=m<<(i-1);
        printf("%d", (k & q) ? 1 : 0);
    }
    printf("\n");
}
тогда в отладчике сразу бы поймал ошибку

Добавлено через 3 минуты
а можно сразу объявить 1 длинной
для моего компилятора
C++
1
(1ULL << (i-1))
0
Диссидент
Эксперт C
27706 / 17322 / 3812
Регистрация: 24.12.2010
Сообщений: 38,979
26.10.2012, 22:40 12
Цитата Сообщение от testsova Посмотреть сообщение
мой код гляньте, мониор протрите.

Не по теме:

Лень за тряпкой лезть, мониор протирать. (Но словечко получилось симпатичное)

Если вы думаете, что копаться в вашем коде кому-то очень интересно, то поверьте, что это не так. Если б передо мной стояла такая задача, я бы ее решил. И решал.
А профессионалы в этом случае поступают просто. Ищите свой баг. Отладчик пошаговый, вывод промежуточных результатов. А вы все - "мой код, мой код". Да его никто и не глядел. И не будет, скорее всего.
Вы видимо думаете, что нашли какую-то редкую ошибку у транслятора. Возможно, это и так. Но все-таки сначала ищите ошибку у себя.
И еще. Имейте в виду, что вам тут никто ничего не должен. Это форум, площадь. Пришли люди, каждый думает о своем, что-то зацепило - "ля-ля-ля"
Если вы уж занялись этим делом, относитесь к нему серьезно,
Удачи.

Добавлено через 2 минуты
Цитата Сообщение от Байт Посмотреть сообщение
И не будет
А вот тут я оказался неправ, что меня радует
0
Модератор
Эксперт по электронике
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,521
26.10.2012, 22:43 13
Байт,
в его коде есть одна ошибка, на которых не только начинающие окарываются (неявная размерность)
и что бы её углядеть нужен огромный опыт или отладчик(чтобы приобрести этот опыт)
1
-8 / 1 / 0
Регистрация: 18.10.2011
Сообщений: 36
26.10.2012, 23:25  [ТС] 14
Цитата Сообщение от ValeryS Посмотреть сообщение
Байт,
в его коде есть одна ошибка, на которых не только начинающие окарываются (неявная размерность)
и что бы её углядеть нужен огромный опыт или отладчик(чтобы приобрести этот опыт)
т.е. всё зависит от компиляттора в данном случае?
0
Диссидент
Эксперт C
27706 / 17322 / 3812
Регистрация: 24.12.2010
Сообщений: 38,979
26.10.2012, 23:57 15
Цитата Сообщение от testsova Посмотреть сообщение
всё зависит от компиляттора
Все зависит только от тебя. от того, как ты научишься с этой машинкой обращаться. Ведь если ты не успел вовремя затормозить - кто виноват? автомобиль или ты? И даже если отказали тормоза - виноват ты, что не учел этого момента и не вовремя прошел техобслуживание
0
-8 / 1 / 0
Регистрация: 18.10.2011
Сообщений: 36
27.10.2012, 00:16  [ТС] 16
Цитата Сообщение от Байт Посмотреть сообщение
Все зависит только от тебя. от того, как ты научишься с этой машинкой обращаться. Ведь если ты не успел вовремя затормозить - кто виноват? автомобиль или ты? И даже если отказали тормоза - виноват ты, что не учел этого момента и не вовремя прошел техобслуживание
я, думал, может это в стандарте описано. но, кажеццо, нет
0
1259 / 650 / 44
Регистрация: 06.02.2011
Сообщений: 1,654
27.10.2012, 10:04 17
Цитата Сообщение от testsova Посмотреть сообщение
я, думал, может это в стандарте описано. но, кажеццо, нет
Что именно не описано? То, что 1 имеет тип int? или то, что для << тип результата определяется по левому операнду? или то что сдвиг на значение превышающее битовую ширину операнда UB?
2
27.10.2012, 10:04
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
27.10.2012, 10:04
Помогаю со студенческими работами здесь

Вывод на экран слова в двоичном виде
Вывод на экран слова в двоичном виде. Как можно вывести слово в дв виде? Я не выкупаю слегка(овер,...

Вывод содержимого регистров в двоичном виде
Нужно вывести на экран двоичные коды шестнадцатеричных цифр, заданных в регистре ax и bx. С bx всё...

Вывод данных в двоичном виде без использования интегрированных функций
Давно где - то видел сам алгоритм... Там всё через битовые сдвиги... Но что - то гугл ничего не...

Длинная арифметика, представления чисел в двоичном виде
Хочу реализовать алгоритм суммирования в двоичной системе. Использовать битовое представления числа...


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

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru