Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/6: Рейтинг темы: голосов - 6, средняя оценка - 4.50
70 / 47 / 5
Регистрация: 10.01.2017
Сообщений: 1,849
1

Типы данных в С++

24.03.2019, 23:44. Показов 1158. Ответов 19
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте,

Позвольте задать несколько наверное простых вопросов, в которых что то запутался:

1)
C++
1
2
3
4
5
int b = 99999999999998;
 
long c = 99999999999998;
...
cout<<;
Выводит следующее:
C++
1
276447230
Почему получается, что и int и long могут хранить максимальное одно и тоже число ? Или это от IDE зависит ?

2)А тут я вообще запутался!
double d = 1.01;
double s1 = 9999999999999998.01;
double s2 = 99999.0123;
double s = 12.0123456789;

Выводится следующее:
C++
1
2
3
4
1.01
1е+16
99999
12.0123
-первое число 1.01 вроде полностью вывело.
-второе вообще не могу понять, что за формат, как его прочитать и нормально ли что в таком формате выводиться ?
-в третьем почему то не вывелись числа после запятой. Хотя если преобразовать в string и вывести на консоль, то число в виде строки выводится полностью.
-в четвертом вывелись, но не все. Хотя если число 12.0123456789 преобразовать в string, а потом вывести, то чисел после запятой уже больше - 12.0123456.

С этим double ничего не понятно.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
24.03.2019, 23:44
Ответы с готовыми решениями:

Типы данных: есть ли универсальный тип, который может заменить все типы данных в Си?
Добрый вечер! Был бы очень признателен, если бы Вы помогли бы мне понять нижеследующие вопросы:...

Какой формат базы данных DSN Access (атрибуты и типы данных)?
В настройках IIS можно выбирать формат журнала, один из форматов - это DSN Access, то есть события...

Типы данных: чем отличается тип данных int от float?
Всем привет! Помогите пожалуйста, чем отличается тип данных int от float?

Типы данных, которые можно использовать в предложении foreach в качестве поставщика данных
Типы данных, которые можно использовать в предложении foreach в качестве поставщика данных 1...

19
Параллельный Кот
1905 / 827 / 350
Регистрация: 25.03.2016
Сообщений: 2,045
25.03.2019, 00:20 2
Цитата Сообщение от Optimus11 Посмотреть сообщение
Почему получается, что и int и long могут хранить максимальное одно и тоже число ? Или это от IDE зависит ?
Почему бы и нет. Зависит только не от IDE, а от реализации, можно сказать от компилятора. Для целых типов есть соотношения их размеров: 1 = sizeof(char) <= sizeof(short) <= sizeof(int) <= sizeof(long) <= sizeof(long long).

Цитата Сообщение от Optimus11 Посмотреть сообщение
С этим double ничего не понятно.
1е+16 - научная запись.

Почитайте теорию и поэкспериментируйте с точностью:
C++
1
2
3
4
5
6
7
8
double d = 12.0123456789;
cout << d << endl;
cout.precision(8);
cout << d << endl;
cout.precision(10);
cout << d << endl;
cout.precision(2);
cout << d << endl;
0
nonedark2008
25.03.2019, 00:24
  #3

Не по теме:

del

0
Mental handicap
1246 / 624 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
25.03.2019, 00:39 4
Цитата Сообщение от Optimus11 Посмотреть сообщение
Почему получается, что и int и long могут хранить максимальное одно и тоже число ?
Как-то так:
There are four signed integer types: 'signed char', 'short int', 'int', and 'long int'. In this list, each type provides at least as much storage as those preceding it in the list. Plain ints have the natural size suggested by the architecture of the execution environment* ;
0
7437 / 5029 / 2892
Регистрация: 18.12.2017
Сообщений: 15,692
25.03.2019, 05:27 5
Цитата Сообщение от Optimus11 Посмотреть сообщение
Выводит следующее: 276447230
Почему получается, что и int и long могут хранить максимальное одно и тоже число ? Или это от IDE зависит ?
Optimus11, 276447230 - не максимальное для int. int - 4 байта, максимальное значение 231-1=2147483647. не совсем понятно, зачем Вы переполняете int, вводя 99999999999998. запустите такую программу:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>
#include <limits>
using namespace std;
 
int main () 
{
    cout << "Max int: " << std::numeric_limits<int>::max() << "\n";
    
    cout << "Max long: "  << std::numeric_limits<long>::max() << "\n";
    
system("pause");
return 0;
}
и сообщите результаты её выполнения.
0
70 / 47 / 5
Регистрация: 10.01.2017
Сообщений: 1,849
25.03.2019, 11:15  [ТС] 6
C++
1
2
3
cout << "Max int: " << std::numeric_limits<int>::max() << "\n";
    
cout << "Max long: "  << std::numeric_limits<long>::max() << "\n";
Да выводит число: 2 147 483 647 и int и long.

Но почему тогда при присвоении int b = 99999999999998; - выводится или заносится число 276 447 230, а не максимальное 2 147 483 647 ?
0
"C with Classes"
1646 / 1403 / 523
Регистрация: 16.08.2014
Сообщений: 5,877
Записей в блоге: 1
25.03.2019, 11:34 7
Цитата Сообщение от Optimus11 Посмотреть сообщение
Но почему тогда при присвоении int b = 99999999999998; - выводится или заносится число 276 447 230, а не максимальное 2 147 483 647 ?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
 
int main()
{
    int i1 = 99999999999998;
    int i2 =                     0b00010000011110100011111111111110;
    __int64 i3 = 0b010110101111001100010000011110100011111111111110;
 
    std::cout << i1 << std::endl;
    std::cout << i2 << std::endl;
    std::cout << i3 << std::endl;
 
    return 0;
}
0
3881 / 2479 / 418
Регистрация: 09.09.2017
Сообщений: 10,888
25.03.2019, 11:55 8
Цитата Сообщение от Optimus11 Посмотреть сообщение
Но почему тогда при присвоении int b = 99999999999998; - выводится или заносится число 276 447 230, а не максимальное 2 147 483 647 ?
Насколько я помню, переполнение знаковых - UB и выводиться там может что угодно, хоть inf.
Обычно же знаковые и беззнаковые ведут себя одинаково и при пересечении верхней границы продолжают счет снизу. Иначе говоря, старшие биты, которые не влезли в переменную, просто отбрасываются. Само число можно записать в шестнадцатеричной системе (она лучше подходит для счета битов):
99999999999998 = 0x00 00 5A F3`10 7A 3F FE
Предположим, у вас четырехбайтный int. Тогда все, что вышло за пределы младших 4 байт, будет отброшено: 0x10 7A 3F FE -> 276`447`230
Если у вас 64-битный int (как на современных системах), то число влезет целиком
Если у вас 16-битный int (как на некоторых микроконтроллерах), то останется только 2 байта: 0x3F FE -> 16`382
.
Но, повторюсь: переполнение знаковых чисел - неопределенное поведение, стандартом не регламентировано.
1
70 / 47 / 5
Регистрация: 10.01.2017
Сообщений: 1,849
25.03.2019, 12:01  [ТС] 9
Тоже самое, при максимуме int в 2 147 483 647, при:

C++
1
2
int i1 = 99999999999998;
int i2 = 0b00010000011110100011111111111110;
Заносится только 276 447 230.
0
"C with Classes"
1646 / 1403 / 523
Регистрация: 16.08.2014
Сообщений: 5,877
Записей в блоге: 1
25.03.2019, 12:03 10
так же тип Optimus11, мозг включай
0
Mental handicap
1246 / 624 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
25.03.2019, 12:03 11

Не по теме:

Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Насколько я помню, переполнение знаковых - UB
Совсем скоро, а именно в С++20 это будет - well-defined.


0
"C with Classes"
1646 / 1403 / 523
Регистрация: 16.08.2014
Сообщений: 5,877
Записей в блоге: 1
25.03.2019, 12:08 12
Цитата Сообщение от Azazel-San Посмотреть сообщение
Совсем скоро, а именно в С++20 это будет - well-defined.
в чем будет выражено well-defined?

Добавлено через 30 секунд
спаси меня от чтения доков
0
261 / 111 / 53
Регистрация: 22.01.2017
Сообщений: 448
25.03.2019, 12:08 13
Optimus11, в добавление к посту от COKPOWEHEU, грубо говоря, переполнение есть модуль от максимально возможного значения:
99999999999998 % (2147483647 + 1) = 276447230
0
Mental handicap
1246 / 624 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
25.03.2019, 12:15 14
_stanislav, ой, там много всего, я еще сам не разобрался, но походу там ввели так называемый "дополнительный код" для чисел или же "второе дополнение" двоичного числа которое определяется как величина, полученная вычитанием числа из наибольшей степени двух (из 2N для N-битного второго дополнения).
1
"C with Classes"
1646 / 1403 / 523
Регистрация: 16.08.2014
Сообщений: 5,877
Записей в блоге: 1
25.03.2019, 12:30 15
Azazel-San, не спас придется доки читать
0
Mental handicap
1246 / 624 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
25.03.2019, 12:50 16
Цитата Сообщение от _stanislav Посмотреть сообщение
придется доки читать
Ну, удачи, если в двух словах то
вводятся целочисленные типы со знаком и без знака.
Биты знака и значения, диапазон представляемых значений задается введением термина «показатель степени».
Затем на их основе вводятся «char» и узкие типы символов.
Понятие «базовый тип» расширено до «char», что согласуется с использованием wchar_t.
The range of representable values for a signed integer type is -2N-1 to 2N-1-1 (inclusive), where N is called the range exponent of the type.
0
3881 / 2479 / 418
Регистрация: 09.09.2017
Сообщений: 10,888
25.03.2019, 16:39 17
Цитата Сообщение от Azazel-San Посмотреть сообщение
Совсем скоро, а именно в С++20 это будет - well-defined.
В Си тоже или только в С++?
0
Mental handicap
1246 / 624 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
25.03.2019, 16:49 18
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
В Си тоже или только в С++?
А кстати что там в С11?
Кажись там брали что-то от Си (могу ошибаться).
http://www.open-std.org/jtc1/s... tml#c-sign
Вот весь пропозал
http://www.open-std.org/jtc1/s... 236r1.html
0
70 / 47 / 5
Регистрация: 10.01.2017
Сообщений: 1,849
25.03.2019, 18:51  [ТС] 19
А все таки не понимаю:

C++
1
2
3
4
5
6
7
double d = 1.01;
double d1 = 12.0123456789;
double d2 = 99999.0123456789;
 
string stroka = to_string(d);
string stroka1 = to_string(d1);
string stroka2 = to_string(d2);
А выводится следующее:

C++
1
2
3
4
5
6
1.01                    //double
1.010000            //string
12.023                //double     -  почему, если перевести в строку выводится больше чисел после знака ?
12.02346            //string
999999               //double      - а здесь вообще почему то после знака ничего не вывелось
999999.0123456 //string
0
Параллельный Кот
1905 / 827 / 350
Регистрация: 25.03.2016
Сообщений: 2,045
25.03.2019, 19:39 20
Цитата Сообщение от Optimus11 Посмотреть сообщение
А все таки не понимаю
Вы вообще по ссылкам ходили, пробовали читать что там написано?

std::defaultfloat
For standard streams, the floatfield format flag is set to this value (defaultfloat) on initialization.

When floatfield is set to defaultfloat, floating-point values are written using the default notation: the representation uses as many meaningful digits as needed up to the stream's decimal precision (precision), counting both the digits before and after the decimal point (if any).
std::to_string
As many digits are written as needed to represent the integral part, followed by the decimal-point character and six decimal digits.
0
25.03.2019, 19:39
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
25.03.2019, 19:39
Помогаю со студенческими работами здесь

Для следующих значений данных определить типы данных
Для следующих значений данных определить типы данных, указать какой объем памяти они занимают,...

Создание базы данных, таблиц, типы данных и триггеры
Здравствуйте. В колледже выдали задание по базам данных. Как создавать базы, таблицы и типы...

Типы данных С# для передачи данных через TCP
подскажите пожалуйста какой тип переменной лучше всего использовать в C# для передачи данных через...

Чтение недопустимых данных, динамические массивы, типы данных
Добрый день, реализую метод интерполяции сплайнами на С++, при подсчете одного из коэффициентов...


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

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