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

Зачем нужны разнообразные целые типы переменных? - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Из полного пути к файлу выделить только имя файла http://www.cyberforum.ru/cpp-beginners/thread647542.html
Написать программу, которая по введённому полному пути к файлу выделяла бы только имя файла (то, что следует после последнего слеша или обратного слеша). Например, ввод: ...
C++ Класс даты Определить ещё один класс Date, дата в котором хранилась бы в упакованном виде. Интерфейс этого класса должен ПОЛНОСТЬЮ СОВПАДАТЬ с интерфейсом класса из задания 1. При этом эти два класса не... http://www.cyberforum.ru/cpp-beginners/thread647505.html
Загрузить процесс из другого процесса C++
Штурм google ничего не дал. Но я помню что что то было такое в книге Рихтера. Пока ищу книгу и нужную страницу, решил оформить все таки вопрос, ведь возможно не только у меня но и у кого то в будущем...
Найти сумму элементов матрицы в строках с отрицательным элементом на главной диагонали C++
Дана вещественная прямоугольная матрица. Найти сумму элементов в строках с отрицательным элементом на главной диагонали. Если сумма больше 0, то элементы последней строки возвести в квадрат. ...
C++ Вычислить методом Ньютона корень уравнения http://www.cyberforum.ru/cpp-beginners/thread647460.html
Помогите, пожалуйста, написать программу, вычисляющую методом Ньютона: sinx - x + 0,5 = 0, интервал изоляции корня .
C++ Массив из рандомов Существует массив, его нужно заполнить рандомными цифрами от 1 до 36, так, чтобы цифры не повторялись: сам дошел до вот такого: #include "iostream" #include "cstdio" #include "cstdlib" using... подробнее

Показать сообщение отдельно
hoggy
Нарушитель
6564 / 2745 / 474
Регистрация: 15.11.2014
Сообщений: 6,091
Завершенные тесты: 1
23.08.2015, 16:07
Цитата Сообщение от Alex Z Посмотреть сообщение
Вот у меня и было как раз число, которое есть размер массива. Исправил int на unsigned int и программа начала выдавать неправильный ответ. Я и сам не ожидал такого.
очевидно жеж, что это - криворукий код.

стандарт предусматривает тип данных size_t,
специально предназначенный для хранения размеров типов,
и как следствие - индексов массивов.

в большинстве реализаций size_t и unsigned - одно и тоже.

а вот использовать для таких целей int - некорректно.

Цитата Сообщение от Alex Z Посмотреть сообщение
Вот зачем нам нужен тип short если есть тип long?
формально, это - не типы данных.
это модификаторы для фундаментального типа int.

есть фундаментальный тип int,
и кучка модификаторов к нему, такие как short, или long.

однако, на практике инты с различными модификаторами опознаются как разные типы.
что и порождает иллюзию, что это принципиально различные типы.

впрочем если их рассматривать, как принципиально разные типы,
то вы ничего страшного не упустите.

сами модификаторы влияют лишь на размер фундаментального типа.

что однако, попадает под правило "промоушена типов".

поэтому, можно сказать,
что модификаторы типов влияют так же и на промоушен типов.


"промоушен типов" - если вкратце, оптимизация вычислений по разрядной сетке машины.

пример:

http://rextester.com/NTVU87023

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
#include <iostream>
using namespace std;
 
int main()
{
    std::cout << "Hello, world!\n";
    
    typedef decltype(short() + short()) sum;
    
    if( is_same<sum, int>::value == 1 )
        cout<<"decltype( short()+short() ) is int"<<endl;
    
    short v1 = 0;
    short v2 = 0;
    
    if( is_same<decltype(v1 +v2), int>::value == 1 )
        cout<<"decltype( v1+v2 ) is int"<<endl;
    
    auto v3 = v1+v2;
    
    if( is_same<decltype(v3), int>::value == 1 )
        cout<<"decltype( v3 ) is int"<<endl;
 
}
стандарт говорит об этом так:

4.5 Integral promotions [conv.prom]
1 A prvalue of an integer type other than bool, char16_t, char32_t, or wchar_t whose integer conversion
rank (4.13) is less than the rank of int can be converted to a prvalue of type int if int can represent all
the values of the source type; otherwise, the source prvalue can be converted to a prvalue of type unsigned
int.
для чего все это нужно?
язык с++ возник не вчера.
он возник во времена, когда ещё не было никаких "современных процессоров".

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

за счет модификаторов и промоушена
становится возможным реализовать оптимизации вычислений
на конкретной платформе.
2
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru