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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 13, средняя оценка - 4.77
morphling
-9 / 19 / 1
Регистрация: 26.06.2010
Сообщений: 181
#1

Как тут происходит перестановка байтов... - C++

26.08.2011, 17:22. Просмотров 1733. Ответов 11
Метки нет (Все метки)

Вот в книге Шилдта 4-е издание... есть такой пример:

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
42
43
44
45
46
47
48
49
50
#include <iostream>
#include <cstdio>
#include <cstring>
#include <windows.h>
using namespace std;
 
union swap_byte
    {
      void swap();
      void set_byte(unsigned short i);
      void show_word();
      
      unsigned short u;
      unsigned char c[2];          
    };
 
void swap_byte::swap()
    {
     unsigned char t;
     t = c[0];
     c[0] = c[1];
     c[1] = t;                  
    }
 
void swap_byte::set_byte(unsigned short i)
   {
    u = i;
   }
 
void swap_byte::show_word()
  {
   cout<<u<<endl;                        
  }
  
 
int main()
{
  SetConsoleCP(1251);
  SetConsoleOutputCP(1251);  
  
  swap_byte a;
  
  a.set_byte(3);
  a.show_word();
  a.swap();
  a.show_word();
    
  system("pause");
  return 0;        
}
передаю параметром
1 выводит 256
2 выводит 512
3 выводит 768
8 выводит 2048

кто нибудь подскажет как это так происходит??
предполагается что число занимает 2 байта...
C++
1
char c[2];
перестановку вижу...

если вот число
0000 0000 0000 0001
то перестановка
0000 0001 0000 0000
так?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.08.2011, 17:22     Как тут происходит перестановка байтов...
Посмотрите здесь:

Как правильно объявить массив байтов? C++
Как прочитать несколько байтов в файле с n-го байта по m-й байт ? C++
Как тут исправить ошибки? C++
C++ Как вписать в переменную текст, размер которой превышает 4096 байтов
класс с конструктором как он тут работает? C++
опишите подробно что тут происходит (int*) C++
Прием по modbus. Как указать число считываемых байтов C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Overmind024
99 / 99 / 6
Регистрация: 10.09.2010
Сообщений: 267
26.08.2011, 18:12     Как тут происходит перестановка байтов... #2
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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
#include <iostream>
using namespace std;
 
union swap_byte
{
    void swap();
    void set_byte(unsigned short i);
    void show_word();
    void print();
 
    unsigned short u;
    unsigned char c[2];          
};
 
void swap_byte::swap()
{
    unsigned char t;
    t = c[0];
    c[0] = c[1];
    c[1] = t;                  
}
 
void swap_byte::set_byte(unsigned short i)
{
    u = i;
}
 
void swap_byte::show_word()
{
    cout<<u<<endl;                        
}
 
void print_byte(unsigned char x)
{
    for(size_t i=8;i;--i)
    {
        cout << ((x >> (i-1)) & 1); 
    }
 
    cout << " ";
}
 
void swap_byte::print()
{
    print_byte(((unsigned char*)&u)[0]);
    print_byte(((unsigned char*)&u)[1]);
    cout << endl;
}
 
 
int main()
{
    swap_byte a;
 
    a.set_byte(2);
    a.print();
    a.swap();
    a.print();
 
    cin.get();
    cin.get();
 
    return 0;        
}
Я добавил две функции. Теперь сам увидишь как происходит перестановка.
Хочу заметить что младшие байты хранятся по младшему адресу.
villu
202 / 202 / 4
Регистрация: 06.08.2011
Сообщений: 600
Записей в блоге: 1
26.08.2011, 18:15     Как тут происходит перестановка байтов... #3
если вот число
0000 0000 0000 0001
то перестановка
0000 0001 0000 0000
так?
да, все верно.
Overmind024
99 / 99 / 6
Регистрация: 10.09.2010
Сообщений: 267
26.08.2011, 18:19     Как тут происходит перестановка байтов... #4
Цитата Сообщение от morphling Посмотреть сообщение
0000 0000 0000 0001
Хочу заметить что это число 256.
morphling
-9 / 19 / 1
Регистрация: 26.06.2010
Сообщений: 181
26.08.2011, 18:35  [ТС]     Как тут происходит перестановка байтов... #5
Да спасибо уже разобрался... через калькулятор посмотрел 0000 0001 0000 0000 вывел 256...
еще в union все хранится в одном учаске памяти да? по самому большому... вот
если будет переменная типа
doubel (8 байт?)
и типа
int (4 байт)
и записать число в int
то она будет записанна в 8байт?
Overmind024
99 / 99 / 6
Регистрация: 10.09.2010
Сообщений: 267
26.08.2011, 18:59     Как тут происходит перестановка байтов... #6
Просто изменятся первые четыре бита double.
morphling
-9 / 19 / 1
Регистрация: 26.06.2010
Сообщений: 181
26.08.2011, 20:30  [ТС]     Как тут происходит перестановка байтов... #7
Цитата Сообщение от Overmind024 Посмотреть сообщение
Просто изменятся первые четыре бита double.
4 байта может?

тоесть если я
int x = 805306368 (11 0000 0000 0000 0000 0000 0000 0000)
то в памяти это будет как
0000 0000 0000 0000 0000 0000 00000 0000 0011 0000 0000 0000 0000 0000 00000 00000
?
Overmind024
99 / 99 / 6
Регистрация: 10.09.2010
Сообщений: 267
26.08.2011, 20:48     Как тут происходит перестановка байтов... #8
Да 4 байта.

Цитата Сообщение от morphling Посмотреть сообщение
то в памяти это будет как
Не так, а вот так:
0011 0000 0000 0000 0000 0000 00000 00000 0000 0000 0000 0000 0000 0000 00000 0000
Но это только в том случаи если там до этого были все нули, а это не обязательно.
Сыроежка
Заблокирован
26.08.2011, 21:14     Как тут происходит перестановка байтов... #9
Цитата Сообщение от morphling Посмотреть сообщение
Да спасибо уже разобрался... через калькулятор посмотрел 0000 0001 0000 0000 вывел 256...
еще в union все хранится в одном учаске памяти да? по самому большому... вот
если будет переменная типа
doubel (8 байт?)
и типа
int (4 байт)
и записать число в int
то она будет записанна в 8байт?
Это зависит от платформы, на которой вы запускаете программу. На 16-битовых платформах, как, например, MS-DOS, размер типа int составляет два байта. на 32-битовых платформах - 4 байта, а на 64-битовых платформах может составлять либо 4 байта, либо 8 байт.

Что касается вашего вопроса. то int будет записано только в тот раздел выделенной памяти для union, который соответствует размеру int, то есть в 4 байта.
morphling
-9 / 19 / 1
Регистрация: 26.06.2010
Сообщений: 181
27.08.2011, 00:14  [ТС]     Как тут происходит перестановка байтов... #10
Цитата Сообщение от Сыроежка Посмотреть сообщение
Это зависит от платформы, на которой вы запускаете программу. На 16-битовых платформах, как, например, MS-DOS, размер типа int составляет два байта. на 32-битовых платформах - 4 байта, а на 64-битовых платформах может составлять либо 4 байта, либо 8 байт.

Что касается вашего вопроса. то int будет записано только в тот раздел выделенной памяти для union, который соответствует размеру int, то есть в 4 байта.
насчет платформ я знаю...
насчет ответа на мой вопрос спасибо понял щас...
вот еще например если я в переменную типа инт записал число
768....
потом к переменной типа doubl ПРИБАВЛЮ НЕ ПРИСВОЮ... то число переменная инт тоже увеличится??

int x = 768;
double y += 2;

вывод икса даст 770?
villu
202 / 202 / 4
Регистрация: 06.08.2011
Сообщений: 600
Записей в блоге: 1
27.08.2011, 00:22     Как тут происходит перестановка байтов... #11
Цитата Сообщение от morphling Посмотреть сообщение
int x = 768;
double y += 2;
вывод икса даст 770?
если все дело это в Union то нет, не выдаст. double хранится не так как int. Скорее всего будет что-то не совсем "адекватное". А скорее всего будет вообще 0 (когда double 8 байт, а int 4).
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.08.2011, 01:39     Как тут происходит перестановка байтов...
Еще ссылки по теме:

C++ Как можно теперь взять и собрать группу из 4-х байтов в один float?
Перестановка байтов в двоичном файле C++
C++ Где тут в коде происходит нахождение корня? (метод половинного деления)
Перестановка байтов C++
C++ Подскажите пожалуйста что тут происходит

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

Или воспользуйтесь поиском по форуму:
Overmind024
99 / 99 / 6
Регистрация: 10.09.2010
Сообщений: 267
27.08.2011, 01:39     Как тут происходит перестановка байтов... #12
Числа с плавающей запятой хранятся при помощи мантиссы и порядка. Это очень похоже не экспонентную форму числа. 1.4 * 10^-4 это 0.00014.
Yandex
Объявления
27.08.2011, 01:39     Как тут происходит перестановка байтов...
Ответ Создать тему
Опции темы

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