Форум программистов, компьютерный форум, киберфорум
Наши страницы
C для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/4: Рейтинг темы: голосов - 4, средняя оценка - 5.00
non_grata
3 / 3 / 0
Регистрация: 07.10.2017
Сообщений: 18
1

Недопонимание с типом int (+перевод числа в строку)

28.10.2017, 14:37. Просмотров 755. Ответов 3
Метки нет (Все метки)

Всем привет, изучаю СИ по книге Брайана Кернигана и столкнулся с функцией itoa(перевод числа в строку). Сам код

it ---> itoa

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 <stdlib.h>
void it (int n, char s[]);
void reverse(char s[]);
 
main()
{
    int n;
    char s[10000];
    it(n, s);
 
 
        return 0;
}
void it (int n, char s[])
{
     int i, sign;
     if ((sign = n) < 0) /* сохраняем знак */
     n = -n; /* делаем n положительным */
     i = 0;
     do { /* генерируем цифры в обратном порядке */
          s[i++] = n % 10 + '0'; /* следующая цифра */
        } while ((n /= 10) > 0); /* исключить ее */
     if (sign < 0)
     s[i++] = '-';
     s[i] = '\0';
     reverse(s);
}
 
void reverse(char s[])
 {
     int i, j;
     char c;
 
     for (i = 0, j = strlen(s)-1; i<j; i++, j--) {
         c = s[i];
         s[i] = s[j];
         s[j] = c;
     }
 
     printf("%s", s);
 }
При подстановке определенных чисел вместо n - получил непонятные для себя выводы программы:
p.s. для удобства выделяю последние две цифры числа/строки скобками [..]
n = ... вывод....

-2 147 483 6[50] ---> 2 147 483 6[46]
-2 147 483 6[49] ---> 2 147 483 6[47]
-2 147 483 6[48] ---> -<
-2 147 483 6[47] ---> -2 147 483 6[47]
---------------------------------------------------------
2 147 483 6[50] ---> -2 147 483 6[46]
2 147 483 6[49] ---> -2 147 483 6[47]
2 147 483 6[48] ---> -<
2 147 483 6[47] ---> 2 147 483 6[47]

Собственно говоря, кто сможет, ответьте, пожалуйста, на мои следующие вопросы:
1) Тип int имеет диапазон значений от -2 147 483 648 до 2 147 483 647, но при n = -2 147 483 648 программа выводит не наше число, а ...(смотреть выше). Почему так происходит? (Я как бы понимаю, почему так происходит, но объяснить не могу, а это значит, что я понимаю не до конца, объясните, пожалуйста, дураку)
2) Второй вопрос не касается данной темы, но касается типа int:

C
1
2
3
4
5
6
7
8
main()
{
    int b = 123312312123231312232313212312311;
    printf("\n%d\n", b);
 
 
        return 0;
}
при b равному такому числу...(смотреть выше), программа выведет ---> 2 147 483 646
если мы перед b поставим минус, то вывод не изменится.

1) Почему выводит именно 2 147 483 646, а не максимальное значение int (2 147 483 647) ?
2) Почему при отрицательном b все равно выводит положительное число 2 147 483 646 ?

p.s. Написано много, поэтому, кто прочитает - уже герой, ну, а кто ответит - заслуживает выше всех похвал. Заранее спасибо!)
0
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.10.2017, 14:37
Ответы с готовыми решениями:

Перевод вводимого числа из char в int
Помогите пожалуйста. Вообщем все работает нормально кроме int main(). выбираю пункт один и...

Перевод числа в строку
ести ли в С функция перевода числа в строку, аналог паскалевой Str()?

Перевод числа с типом Е в текстовый формат
А вот неожиданный вопрос. Есть диапазон ячеек, заполненных данными формата типа 5,40E+11 ...

Перевод в систему счисления числа с типом char
Всем привет. Задача: ввести число в переменную с типом char и перевести его в 2-ю систему...

Как определить, какую наибольшую степень числа 100 можно вычислить, пользуясь типом int
Всем привет! Только начал изучать java и сталкнулся с такой проблемкой. Вот собственно сама задача....

3
COKPOWEHEU
1340 / 970 / 222
Регистрация: 09.09.2017
Сообщений: 4,038
28.10.2017, 18:02 2
Цитата Сообщение от non_grata Посмотреть сообщение
1) Почему выводит именно 2 147 483 646, а не максимальное значение int (2 147 483 647) ?
Возможно, берутся последние (младшие) 32 байта - то что поместилось в int. А возможно, сам компилятор не может прочитать число целиком и обрезает по собственному усмотрению (но это вряд ли).
1
sidor_01
80 / 80 / 72
Регистрация: 25.02.2017
Сообщений: 175
29.10.2017, 01:25 3
Лучший ответ Сообщение было отмечено non_grata как решение

Решение

Цитата Сообщение от non_grata Посмотреть сообщение
но при n = -2 147 483 648 программа выводит не наше число, а ...(смотреть выше). Почему так происходит?
При данном n в строке 18 программы происходит выход за диапозон целочисленного типа

Стандарт языка не указывает как должны вести себя типы со знаком при выходе за допустимый диапозон значений. Поскольку поведение неопределено то и гадать почему так а не по другому смысла нету
1
non_grata
3 / 3 / 0
Регистрация: 07.10.2017
Сообщений: 18
29.10.2017, 15:01  [ТС] 4
Ааа, блин, точно, не углядел)
0
29.10.2017, 15:01
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.10.2017, 15:01

Перевод int в char (строку)
Есть код я покажу только части для указания на проблему int c=0; char a={' ',' '};...

перевод Int в строку и вывести в WINAPI
Не могу перевести int в строку так чтобы вывести его через TextOut: Подскажите код для...

Перевод Int в строку и вывод ее в WinAPI
Не могу перевести int в строку так чтобы вывести его через TextOut: Подскажите код для...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru