1 Востаннє редагувалося oldebolkan (02.11.2017 18:57:38)

Тема: Ліміти значень.

Як з допомого операторів на С визначити максимум та мінімум типу данни int, short, float...
Наведіть будь-ласка приклади.

[code=C]#include<stdio.h>
#include<limits.h>
#include<locale.h>
int main(void)
{
    char*locale=setlocale(LC_ALL,"");   
    printf("————————————————————————————————————————————————————————————————————————————————————————————\n");
    printf("|                                        Типи данних                                       |\n");
    printf("————————————————————————————————————————————————————————————————————————————————————————————\n");
    printf("|Назва типу        |Пояснення                                   |Дiапазон значень          |\n");
    printf("|short             |Коротке цiле число                          |%-d...%-d            |\n", SHRT_MIN, SHRT_MAX);
    printf("|unsigned short    |Коротке цiле число без знаку.               |0...%-d                 |\n", USHRT_MAX);
    printf("|int               |Цiле число                                  |%-d...%-d  |\n", INT_MIN, INT_MAX);
    printf("|unsigned int      |Цiле число                                  |0...%-d                    |\n", UINT_MAX);
    printf("|char              |Один символ                                 |%-d...%-d                |\n", CHAR_MIN, CHAR_MAX);     
    printf("|char[]            |Рядок                                       |                          |\n");     
    printf("|long              |Довге цiле число                            |%-d...%-d  |\n", LONG_MIN, LONG_MAX);
    printf("|unsigned long     |Довге цiле число без знаку                  |0...%-d                    |\n", ULONG_MAX);
    printf("|long long         |                                            |%-d...%-d                    |\n", LLONG_MIN, LLONG_MAX);       
    printf("|unsigned long long|                                            |%-d ...%-d |\n",LONG_MIN, LONG_MAX);   
    printf("————————————————————————————————————————————————————————————————————————————————————————————\n");   
    return 0;
}[/code]
Я мав на увась щось такого формату.
Але в мене не відображаються деякі типи.
http://replace.org.ua/misc.php?action=pun_attachment&amp;item=1660&amp;download=0

Post's attachments

Screenshot_3.png 17.22 kb, 132 downloads since 2017-11-02 

2

Re: Ліміти значень.

Ви про "sizeof" чули?

3

Re: Ліміти значень.

Очевидно, що ніяк.
C працює на купі різних архітектур, в т.ч. із доповяльним, прямим та оберненим кодом для від'ємних чисел (п. 6.2.6.2 параграф 2 C99). Відтак без інформації про спосіб представлення числа нічого операторами не вдієш.

Подякували: leofun011

4

Re: Ліміти значень.

oldebolkan
Читайте Стівена Пратту аби не виглядати розумово відсталим недоучнем.

5

Re: Ліміти значень.

0xDADA11C7 написав:

Читайте Стівена Пратту аби не виглядати розумово відсталим недоучнем.

Ви уточнюйте, кому це кажете.

Подякували: 0xDADA11C7, leofun012

6

Re: Ліміти значень.

Отак от

Подякували: leofun011

7

Re: Ліміти значень.

0x9111A написав:

Отак от

Все правильно, але скажіть де там оператори? Бо пан oldebolkan наступного разу прийде і буде нахабно просити ковбасою визначати розміри типових типів даних мови С.

Подякували: koala1

8 Востаннє редагувалося P.Y. (02.11.2017 01:09:19)

Re: Ліміти значень.

Може, в задачці треба отримати максимальне та мінімальне значення того чи іншого типу, не знаючи його наперед і використовуючи, наприклад, побітні операції та зсуви?
Для беззнакових цілих (unsigned int) усе зрозуміло: найменше значення — 0, найбільше — число, що має 1 в усіх двійкових розрядах (можна отримати, присвоївши змінній значення 0, після чого перетворивши всі нулі на одиниці оператором ~ «побітне не»).

Для цілих чисел зі знаком (int, short, long) — існують різні форми представлення, як писав вище koala, але найпоширеніший варіант — доповнювальний код. Відповідно, в двійковій формі найбільше можливе число матиме нуль у старшому розряді (тобто, найлівішому, який у цьому форматі визначає знак числа) й одиниці в решті розрядів, найменше можливе число — одиницю в старшому розряді й нулі в решті. Можна створити такі числа, використовуючи зсув (<< чи >>) та згадане вище ~.

Щодо float — в принципі, щось подібне теж можна зробити, але треба дивитись опис конкретної реалізації. Крім того, для побітних маніпуляцій з float доведеться здійснювати доступ до нього як до цілого числа чи набору байтів (наприклад, можна створити union, одне з полів якого має тип float, друге — масив char (кожен з яких займає один байт) розміру sizeof(float), а після маніпуляцій з байтами просто взяти значення поля float). Утім, мабуть, це трохи зависокий рівень складності, як на задачу для початківців.

Подякували: NaharD, leofun012

9

Re: Ліміти значень.

Причому якби мова була C++, то за стандартом там всі ці деталі визначені. Але вам задали C... і викладач, швидше за все, сам не знає, що там такий зоопарк.

Подякували: leofun011

10

Re: Ліміти значень.

koala написав:

Причому якби мова була C++, то за стандартом там всі ці деталі визначені. Але вам задали C... і викладач, швидше за все, сам не знає, що там такий зоопарк.

А можна детальніше?

11

Re: Ліміти значень.

0x9111A написав:
koala написав:

Причому якби мова була C++, то за стандартом там всі ці деталі визначені. Але вам задали C... і викладач, швидше за все, сам не знає, що там такий зоопарк.

А можна детальніше?

Там тільки доповняльний для цілих і рухома кома за IEEE 754.

Подякували: leofun011

12

Re: Ліміти значень.

koala написав:

Там тільки доповняльний для цілих і рухома кома за IEEE 754.

Пруф для "two's complement" знайти не так просто виявилось
І щось мені здається що IEEE 754 не гарантований (std::numeric_limits::is_iec559)

Подякували: leofun011

13

Re: Ліміти значень.

0x9111A написав:
koala написав:

Там тільки доповняльний для цілих і рухома кома за IEEE 754.

Пруф для "two's complement" знайти не так просто виявилось
І щось мені здається що IEEE 754 не гарантований (std::numeric_limits::is_iec559)

Гм. Схоже, таки пам'ять мені зраджує.

N4567 п. 3.9.1 параграф 7 написав:

...this International Standard permits 2’s complement, 1’s complement and signed magnitude representations for integral types...

N4567 п. 3.9.1 параграф 8 написав:

...The value representation of floating-point types is implementation-defined...

Подякували: 0x9111A, leofun012

14

Re: Ліміти значень.

koala написав:

Причому якби мова була C++, то за стандартом там всі ці деталі визначені. Але вам задали C... і викладач, швидше за все, сам не знає, що там такий зоопарк.

До речі, а на яких саме архітектурах/реалізаціях мови Сі використовується не доповнювальний код, а щось інше?

15

Re: Ліміти значень.

P.Y. написав:
koala написав:

Причому якби мова була C++, то за стандартом там всі ці деталі визначені. Але вам задали C... і викладач, швидше за все, сам не знає, що там такий зоопарк.

До речі, а на яких саме архітектурах/реалізаціях мови Сі використовується не доповнювальний код, а щось інше?

У мене колись був довідничок з таблицею архітектур, там було що завгодно, включно з 9 біт на байт.

16

Re: Ліміти значень.

Ну так коли то було... Зараз, мабуть, такі машини в музеях стоять.

17

Re: Ліміти значень.

P.Y. написав:

Ну так коли то було... Зараз, мабуть, такі машини в музеях стоять.

Якщо навіть зараз це й так, то ніхто не може гарантувати, що за кілька років якийсь винахід не змінить ситуацію.

18

Re: Ліміти значень.

oldebolkan, дякую за уточнення. Взагалі було б краще, якби в майбутньому ви взяли на озброєння схему "що роблю - що виходить - що очікувалося", це одразу знімає купу питань. Ну і дописуйте в темі, якщо відредагували повідомлення, редакції не позначаються як нова інформація.
У вас проблема не в тому, що ви отримуєте неправильні відповіді, а в тому, що ви неправильно їх виводите. Отже:

  • unsigned int: %d виводить знаковий int, а вам потрібен беззнаковий, %u.

  • long (int) позначається %ld (%lu - беззнаковий).

  • long long (int) позначається %lld (%llu - беззнаковий).

Подякували: oldebolkan, leofun012

19

Re: Ліміти значень.

koala написав:
P.Y. написав:

Ну так коли то було... Зараз, мабуть, такі машини в музеях стоять.

Якщо навіть зараз це й так, то ніхто не може гарантувати, що за кілька років якийсь винахід не змінить ситуацію.

А якщо цей винахід змінить ситуацію в наш час, то, ймовірно, програмно його буде реалізовано в C та C++ ідентичним чином (напр., буде впроваджено новий тип даних, певним чином стандартизований). Той факт, що стандарт C передбачає більшу невизначеність, ніж стандарт C++, якраз і свідчить про актуальність проблеми різнобою архітектур у часи становлення C, тоді як на момент появи плюсів більшість варіантів успішно занепали, і те, що залишилось, стало можливо стандандартизувати без зайвої амбіжності.

20

Re: Ліміти значень.

P.Y. написав:
koala написав:
P.Y. написав:

Ну так коли то було... Зараз, мабуть, такі машини в музеях стоять.

Якщо навіть зараз це й так, то ніхто не може гарантувати, що за кілька років якийсь винахід не змінить ситуацію.

А якщо цей винахід змінить ситуацію в наш час, то, ймовірно, програмно його буде реалізовано в C та C++ ідентичним чином (напр., буде впроваджено новий тип даних, певним чином стандартизований). Той факт, що стандарт C передбачає більшу невизначеність, ніж стандарт C++, якраз і свідчить про актуальність проблеми різнобою архітектур у часи становлення C, тоді як на момент появи плюсів більшість варіантів успішно занепали, і те, що залишилось, стало можливо стандандартизувати без зайвої амбіжності.

Це свідчить хіба про мою неуважність, адже насправді стандарт C++ посилається на стандарт C.