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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Ksan
27 / 27 / 0
Регистрация: 02.11.2010
Сообщений: 370
#1

double - C++

04.07.2012, 17:37. Просмотров 1131. Ответов 21
Метки нет (Все метки)

Если преобразовать double к char*, то какие байты будут отвечать за целую часть, а какие за дробную?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.07.2012, 17:37     double
Посмотрите здесь:

double - C++
double s = (1 / 5); cout << s; в моём понимании он должен вывести 0.2 ну или что-то типо того. Но выводит 0... Чё то я не понимаю...

double и for - C++
Здравствуйте, объясните пожалуйста почему в операции: for (double y = .1; y != 1.0; y += .1) получается бесконечный цикл, то есть...

Double - C++
чтото тут не так, не выдает ошибку но пишет -175756757567657 вот код double z; z=10,3; printf("%d", z); делаю по...

Long Double - C++
Разве нет типа более емкого, чем Double в Visual studio? Long Double, как я понял, определяется как обычный Double. А мне нужен аналог по...

Преобразование к double - C++
Есть переменная типа Timestamp. Timestamp определен как структура: struct Timestamp { unsigned int seconds :32; unsigned...

double + cout - C++
Через cout вывожу double. double a = 48.799999999999997; cout << a; Выводит: 48.8. Как сделать, что бы не...

Double в string - C++
Как преобразовать double в string. Пробовал так: ostringstream ost; ost <<setprecision(30) << n; c = ost.str(); cout <<...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Catstail
Модератор
22515 / 10920 / 1774
Регистрация: 12.02.2012
Сообщений: 18,067
04.07.2012, 17:56     double #2
Не так просто... Числа типа double хранятся в виде двух битовых полей мантиссы (нормализованная дробная часть) и двоичного порядка.
cppGhost
32 / 30 / 1
Регистрация: 21.06.2012
Сообщений: 91
04.07.2012, 17:57     double #3
Не совсем понял, но привести число к указателю на char? Так компилятор не даст скорее всего.
C++
1
2
3
4
5
double var = 30;
char *p = "O";
 
p = var;    // тут ругнется при компиляции
*p = var;  // тут выдаст предупреждение и потом может вообще упасть
Ksan
27 / 27 / 0
Регистрация: 02.11.2010
Сообщений: 370
04.07.2012, 17:58  [ТС]     double #4
cppGhost,
C++
1
2
3
double val; 
char* p; 
p = (char*)&val;
Catstail
Модератор
22515 / 10920 / 1774
Регистрация: 12.02.2012
Сообщений: 18,067
04.07.2012, 17:58     double #5
Компилятор даст, если сделать правильно...

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include "stdio.h"
 
int main(int argc, char* argv[])
{
    double x=111.111;
    char *c;
 
    c= (char *) &x;
 
    printf("%d\n",c[0]);
    printf("%d\n",c[1]);
    printf("%d\n",c[2]);
    printf("%d\n",c[3]);
    printf("%d\n",c[4]);
    printf("%d\n",c[5]);
    printf("%d\n",c[6]);
    printf("%d\n",c[7]);
 
    return 0;
}
Ksan
27 / 27 / 0
Регистрация: 02.11.2010
Сообщений: 370
04.07.2012, 18:00  [ТС]     double #6
Catstail, понятно. Значит в это лучше не лезть?
Catstail
Модератор
22515 / 10920 / 1774
Регистрация: 12.02.2012
Сообщений: 18,067
04.07.2012, 18:06     double #7
Вовсе нет! Это по-своему интересно! Понимая, как хранятся числа с плав. точкой, ты всегда сможешь (если захочешь) построить программную плавающую арифметику на любой платформе. Или построить свою арифметику сверхвысокой точности. Лишних знаний не бывает!
cppGhost
32 / 30 / 1
Регистрация: 21.06.2012
Сообщений: 91
04.07.2012, 18:07     double #8
Хорошо, так компилятор даст
C++
1
p = (char*)&val;
но что мы тут делаем. адрес переменной типа double подставляем в указатель типа char. double 8 байт, char 1. кстати, проверил MSVS 2008, в p нет ожидаемого значения.
Ksan
27 / 27 / 0
Регистрация: 02.11.2010
Сообщений: 370
04.07.2012, 18:09  [ТС]     double #9
cppGhost, это даст побайтовое представление переменной. попробуй с int
cppGhost
32 / 30 / 1
Регистрация: 21.06.2012
Сообщений: 91
04.07.2012, 18:22     double #10
хм, а как с int будет представляться число 257, скажем, если char* 1 байт?
не, может я просто знаю условие задачи, ради которой это все тут началось. с другой стороны для себя кое-что новое узнал, спасибо )

Добавлено через 1 минуту
Кстати, с float тоже не работает, хотя как и int те же 4 байта

Добавлено через 2 минуты
Да и вообще не понятно. Вот есть char *p, он знает, что значение лежит по адресу: p + sizeof(char). Мы даем ему адрес переменной типа int, как он определит, что нужно брать уже sizeof(int)?
Catstail
Модератор
22515 / 10920 / 1774
Регистрация: 12.02.2012
Сообщений: 18,067
04.07.2012, 18:30     double #11
Смотри. Берем код:

C++
1
2
3
4
5
6
7
8
9
10
11
#include "stdio.h"
 
int main(int argc, char* argv[])
{
    int x=234;
    unsigned char *c;
    c= (unsigned char *) &x;
    printf("%2x\n",c[0]);
    printf("%2x\n",c[1]);
    return 0;
}
Запускаем. И видим вывод:

ea
0

Разберемся. Для начала переведем 234 в 16-ричную систему. Получаем 23410=00EA16. Теперь нужно вспомнить, что в интеловских процессорах принят обратный порядок байтов. Поэтому у нас и получилось EA00, что для человека означает 00EA.

А если подставить x=-234. То вывод будет:

16
FF

Что сие значит? Отрицательные числа хранятся в дополнительном коде. Он получается так: сначала берем исходное число и заменяем нули единицами, единицы - нулями (инверсия битов). Из 00EA получится FF15. А потом добавляем единицу к младшему разряду.
Получаем FF16. В памяти байты переставляются, вот и получается 16FF. Все понятно?
cppGhost
32 / 30 / 1
Регистрация: 21.06.2012
Сообщений: 91
04.07.2012, 18:37     double #12
C++
1
printf("%2x\n",c[1]);
а вот это что такое? я ведь могу написать и
C++
1
printf("%2x\n",c[2]);
и будет тоже 0. я просто к тому, что если число, лежащее в int Больше 255, то никакой c[0]...c[1]...c[2] не отобразит исходное число. или я не прав?
Catstail
Модератор
22515 / 10920 / 1774
Регистрация: 12.02.2012
Сообщений: 18,067
04.07.2012, 18:46     double #13
В моей системе тип int имеет длину 4 байта. Поэтому c[0],c[1],c[2],c[3] будут частями нашего int. А вот с[4] уже к числу не относится.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include "stdio.h"
 
int main(int argc, char* argv[])
{
   int x=-234;
   unsigned char *c;
   printf("Size of int=%d\n",sizeof(int));
   с= (unsigned char *) &x;
   printf("%2x\n",c[0]);
   printf("%2x\n",c[1]);
   printf("%2x\n",c[2]);
   printf("%2x\n",c[3]);
 
   printf("%2x\n",c[4]); // напечаться может что угодно...
 
   return 0;
}
Миниатюры
double  
Schizorb
509 / 461 / 16
Регистрация: 07.04.2012
Сообщений: 865
Записей в блоге: 1
Завершенные тесты: 1
04.07.2012, 18:50     double #14
Цитата Сообщение от cppGhost Посмотреть сообщение
я просто к тому, что если число, лежащее в int Больше 255, то никакой c[0]...c[1]...c[2] не отобразит исходное число.
Отобразит... Значение же не будет копироваться в переменную типа char. Указатель и индексация тут используются просто для доступа к отдельным байтам исходного значения.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <cstdio>
 
int main(int argc, char* argv[])
{
    int x = 30000;
    unsigned char *c;
    c = (unsigned char *) &x;
    
    for(int i = 0; i < sizeof(int); ++i)
    {
        printf("%2x\n",c[i]);
    }
    
    return 0;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.07.2012, 18:51     double
Еще ссылки по теме:

Random for double:( - C++
Задание: Создать функцию random(a, b), которая возвращает случайное вещественное число от вещественного числа a включительно до...

DWORD to double - C++
нарисовалась такая проблемка - не могу корректно привести число типа DWORD к числу типа double если кто знает-подскажите как это...

Округление double - C++
Короче ввожу число 1.05 в Debug показывает его, как 1.004999999999999999995663191310058 вот как эту чушь убрать, у меня задача из-за...

Double to String - C++
Здравствуйте.Какая функция переводит формат Double в Ansistring.Пробовал DoubleToStr(); не получается...

Точность в double - C++
Добрый день Мне задали сделать проект в универе - Калькулятор с великой точностю. Я уже почти его сделал, но у меня возникла...


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

Или воспользуйтесь поиском по форуму:
cppGhost
32 / 30 / 1
Регистрация: 21.06.2012
Сообщений: 91
04.07.2012, 18:51     double #15
вот у вас
Цитата Сообщение от Catstail Посмотреть сообщение
int x=-234;
число отрицательное, это специально? просто если заменить на

Цитата Сообщение от Catstail Посмотреть сообщение
int x=400;
, то мы не получим в выводе побайтовые значения
Yandex
Объявления
04.07.2012, 18:51     double
Ответ Создать тему
Опции темы

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