Аватар для D.E.S.P.E.R.O.
9 / 9 / 1
Регистрация: 12.03.2009
Сообщений: 110

Запись четырехсимвольных констант в int

27.09.2012, 14:57. Показов 696. Ответов 8
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Вопрос состоит в следующем. Почему восьмеричные и шестнадцатиричные символьные коды четырехсимвольной константы записываются в int в обратной последовательности, а аналогичная константа с использованием непосредственно символов таблицы ASCII, уже в прямой последовательности?
Тоесть:
C++
1
int i = '\141\142\143\144';
или
C++
1
int i = '\x61\x62\x63\x64';
что должно быть равносильно
C++
1
int i = 'abcd';
в двоичном виде выглядит как: 01100100.01100011.01100010.01100001. А оператор
C++
1
int i = 'abcd';
который должен был бы давать результат, аналогичный приведенному выше, выглядить: 01100001.01100010.01100011.0110100, тоесть записан в обратном порядке!
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
27.09.2012, 14:57
Ответы с готовыми решениями:

error C2664: itoa: невозможно преобразовать параметр 1 из 'int *' в 'int' + запись в файл
Подскажите пожалуйста как быть... в конструктор приходит *int и мне нужно создать файл, с именем таким же, что и значение, которое приходит...

Нюансы синтаксиса: что означает запись vector<int*> a и vector <int>*a ?
Часто встречается вот такая запись: vector&lt;int&gt; a; это понятно что. Массив объектов int А вот что такое vector&lt;int*&gt; a; ...

Error LNK2019: unresolved external symbol "public: __thiscall Vector<int>::Vector<int>(int,int,int)" (?0?$Vec
Вот есть заголовочный файл // Заголовочный файл Vector.h #ifndef VECTOR_H #define VECTOR_H #include &lt;iostream&gt; using...

8
154 / 138 / 34
Регистрация: 23.05.2009
Сообщений: 275
27.09.2012, 16:39
something like this
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
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
#include <iostream>
 
template<class T>
void printBin(const T &obj, std::ostream& os = std::cout, char spacing = '\0');
 
template<class T>
void ptrPrintBin(const T* dPtr, size_t len, std::ostream& os = std::cout, char spacing = '\0');
 
int convertToInt(const char* src);
int rConvertToInt(const char* src);
 
int main()
{
    const char *str = "abcd";
    std::cout<<"Binary representation of string bytes:\n";
    ptrPrintBin(str, strlen(str), std::cout, '.');
 
    int frst = convertToInt(str);
    std::cout<<"Binary representation of the first int:\n";
    printBin(frst, std::cout, '.');
 
    std::cout<<"Binary representation of the second int:\n";
    int scnd = rConvertToInt(str);
    printBin(scnd, std::cout, '.');
}
 
template<class T>
void printBin(const T &obj, std::ostream& os, char spacing)
{
    const unsigned char* ptr = reinterpret_cast<const unsigned char*>(&obj);
    const size_t bytes = sizeof(T);
    for(size_t i = 0; i < bytes; ++i)
    {
        printBin(ptr[i], os);
        if (spacing && i != (bytes - 1))
        {
            os << spacing;
        }
        else
        {
            os << std::endl;
        }
    }
}
 
template<>
void printBin<unsigned char>(const unsigned char &ch, std::ostream& os, char spacing)
{
    for(int i = 7; i >= 0; --i)
    {
        os << ((ch & (1 << i))? 1: 0);
    }
}
 
template<class T>
void ptrPrintBin(const T* dPtr, size_t len, std::ostream& os, char spacing)
{
    if (dPtr == NULL)
        return;
    const unsigned char* ptr = reinterpret_cast<const unsigned char*>(dPtr);
    const size_t bytesT = sizeof(T);
    const size_t bytes = bytesT * len;
    for(size_t i = 0; i < bytes; ++i)
    {
        printBin(ptr[i], os);
        if (spacing && i != (bytes - 1))
        {
            os << spacing;
        }
        else
        {
            os << std::endl;
        }
    }
}
 
int convertToInt(const char* src)
{
    const unsigned char *uchar_ptr = reinterpret_cast<const unsigned char*>(src);
    size_t szInt = sizeof(int);
    unsigned int cInt = 0;
    for(size_t i = 0; i < szInt; ++i)
    {
        cInt += (uchar_ptr[i] << (i * 8));
    }
    return cInt;
}
 
int rConvertToInt(const char* src)
{
    const unsigned char *uchar_ptr = reinterpret_cast<const unsigned char*>(src);
    size_t szInt = sizeof(int);
    unsigned int cInt = 0;
    for(size_t i = 0; i < szInt; ++i)
    {
        cInt += (uchar_ptr[i] << ((szInt - 1 - i) * 8));
    }
    return cInt;
}
0
~ Эврика! ~
 Аватар для OhMyGodSoLong
1258 / 1007 / 74
Регистрация: 24.07.2012
Сообщений: 2,002
27.09.2012, 16:50
Цитата Сообщение от D.E.S.P.E.R.O. Посмотреть сообщение
Вопрос состоит в следующем. Почему восьмеричные и шестнадцатиричные символьные коды четырехсимвольной константы записываются в int в обратной последовательности, а аналогичная константа с использованием непосредственно символов таблицы ASCII, уже в прямой последовательности?
Потому что это implementation-defined поведение и компилятор может писать туда что хочет и в каком хочет порядке. 2.14.3/1, конец абзаца.
1
 Аватар для D.E.S.P.E.R.O.
9 / 9 / 1
Регистрация: 12.03.2009
Сообщений: 110
27.09.2012, 17:04  [ТС]
Извините Andsteadur, но я не спрашиваю "как". Написать такую програму я могу и сам, к тому же, это можно сделать намного проще, чем в выше приведенном коде. Я спрашивал совсем о другом.

Добавлено через 14 минут
Цитата Сообщение от ~OhMyGodSoLong~ Посмотреть сообщение
Потому что это implementation-defined поведение и компилятор может писать туда что хочет и в каком хочет порядке. 2.14.3/1, конец абзаца.
То есть это напрямую зависит от используемого компилятора?
0
~ Эврика! ~
 Аватар для OhMyGodSoLong
1258 / 1007 / 74
Регистрация: 24.07.2012
Сообщений: 2,002
27.09.2012, 17:12
Цитата Сообщение от D.E.S.P.E.R.O. Посмотреть сообщение
То есть это напрямую зависит от используемого компилятора?
Да, именно так.
0
 Аватар для D.E.S.P.E.R.O.
9 / 9 / 1
Регистрация: 12.03.2009
Сообщений: 110
27.09.2012, 17:21  [ТС]
Извините за невежиство (пока сложно работать с такого рода документацией), но это касается и восьми- шестнадцатиричных символьных кодов или только ASCII символов?
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
 Аватар для easybudda
12840 / 7581 / 1766
Регистрация: 25.07.2009
Сообщений: 13,973
27.09.2012, 17:24
Цитата Сообщение от D.E.S.P.E.R.O. Посмотреть сообщение
То есть это напрямую зависит от используемого компилятора?
Цитата Сообщение от ~OhMyGodSoLong~ Посмотреть сообщение
Да, именно так.
Это зависит от порядка байт (byte order), принятого в системе. На MacOS X значения в int "нормально" пишутся, а не "задом на перёд". Читайте про little endian / big endian byte order...
1
~ Эврика! ~
 Аватар для OhMyGodSoLong
1258 / 1007 / 74
Регистрация: 24.07.2012
Сообщений: 2,002
27.09.2012, 17:28
Цитата Сообщение от D.E.S.P.E.R.O. Посмотреть сообщение
Извините за невежиство (пока сложно работать с такого рода документацией), но это касается и восьми- шестнадцатиричных символьных кодов или только ASCII символов?
Это касается любых "многосимвольных" символьных литералов: 'что-то', где это что-то — не один-единственный символ. Такие литералы имеют тип int и его значение определяется реализацией (компилятором). А эта реализация вполне может трактовать шестнадцатеричную запись как просто число ('\x12\x34\x56\x78' как 0x12345678), а четыре символа как четыре байта ('\x12\x34\x56\x78' — в смысле, там непосредственно символы с такими кодами — как "\x12\x34\x56\x78", а потом этот кусок памяти посчитать как int и получить соответствующую проблему с порядком байт в многобайтных значениях, она же endianness).
1
 Аватар для D.E.S.P.E.R.O.
9 / 9 / 1
Регистрация: 12.03.2009
Сообщений: 110
27.09.2012, 17:50  [ТС]
Цитата Сообщение от easybudda Посмотреть сообщение
Это зависит от порядка байт (byte order), принятого в системе. На MacOS X значения в int "нормально" пишутся, а не "задом на перёд". Читайте про little endian / big endian byte order...
Просто в одном случае порядок правильный, а в другом обратный. Но это одна и та же система и компилятор.

Добавлено через 1 минуту
Цитата Сообщение от ~OhMyGodSoLong~ Посмотреть сообщение
Это касается любых "многосимвольных" символьных литералов: 'что-то', где это что-то — не один-единственный символ. Такие литералы имеют тип int и его значение определяется реализацией (компилятором).
Вот оно как... Спасибо большое. Мне очень помогло и многое проясняет!

Добавлено через 19 минут
Цитата Сообщение от ~OhMyGodSoLong~ Посмотреть сообщение
А эта реализация вполне может трактовать шестнадцатеричную запись как просто число ('\x12\x34\x56\x78' как 0x12345678), а четыре символа как четыре байта ('\x12\x34\x56\x78' как "\x12\x34\x56\x78", а потом этот кусок памяти посчитать как int и получить соответствующую проблему с порядком байт).
Все правильно, только с точностью до наоборот! Шестнадцатиричные коды реализация трактует как байты и в соответствии с little / big endian byte order пишет их с права на лево, а символы просто понимает как число! Еще раз большое спасибо всем!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
27.09.2012, 17:50
Помогаю со студенческими работами здесь

Запись из int в string
Добрый день! Прошу помочь с выводом текста через строковый тип данных.( полностью решать не нужно, интересует только вывод (через цикл for...

Что означает запись int (*a)[10]?
int (*a); Что создаёт компилятор если я забиваю это?

Что означает запись int **a
int * a-указатель на целочисленное.А это что- int **a ?

Ошибка при компиляции error: cannot convert ‘int (*)[5]’ to ‘int**’ for argument ‘1’ to ‘void Replase(int**)'
#include &lt;iostream&gt; #include &lt;ctime&gt; #include &lt;iomanip&gt; #include &lt;cstdlib&gt; #define row 5 #define col 5 using namespace...

В каком случае надо начинать с int main() или с int _tmain( int argc, _TCHAR* argv[] ) и т.д.?
Не понимаю, с чего начинать. Заранее спс.


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

Новые блоги и статьи
Компиляция C++ с Clang API
NullReferenced 24.03.2025
Компиляторы обычно воспринимаются как черные ящики, которые превращают исходный код в исполняемые файлы. Мы запускаем компилятор командой в терминале, и вуаля — получаем бинарник. Но что если нужно. . .
Многопоточное программировани­е в C#: Класс Thread
UnmanagedCoder 24.03.2025
Когда запускается приложение на компьютере, операционная система создаёт для него процесс - виртуальное адресное пространство. В C# этот процесс изначально получает один поток выполнения — главный. . .
SwiftUI Data Flow: Передача данных между представлениями
mobDevWorks 23.03.2025
При первом знакомстве со SwiftUI кажется, что фреймворк предлагает избыточное количество механизмов для передачи данных: @State, @Binding, @StateObject, @ObservedObject, @EnvironmentObject и другие. . . .
Моки в Java: Сравниваем Mockito, EasyMock, JMockit
Javaican 23.03.2025
Как протестировать класс, который зависит от других сложных компонентов, таких как базы данных, веб-сервисы или другие классы, с которыми и так непросто работать в тестовом окружении? Для этого и. . .
Архитектурные паттерны микросервисов: ТОП-10 шаблонов
ArchitectMsa 22.03.2025
Популярность микросервисной архитектуры объясняется множеством важных преимуществ. К примеру, она позволяет командам разработчиков работать независимо друг от друга, используя различные технологии и. . .
Оптимизация рендеринга в Unity: Сортировка миллиона спрайтов
GameUnited 22.03.2025
Помните, когда наличие сотни спрайтов в игре приводило к существенному падению производительности? Время таких ограничений уходит в прошлое. Сегодня геймдев сталкивается с задачами совершенно иного. . .
Образование и практика
Igor3D 21.03.2025
Добрый день А вот каково качество/ эффективность ВУЗовского образования? Аналитическая геометрия изучается в первом семестре и считается довольно легким курсом, что вполне справедливо. Ну хорошо,. . .
Lazarus. Таблица с объединением ячеек.
Massaraksh7 21.03.2025
Понадобилась представление на экране таблицы с объединёнными ячейками. И не одной, а штук триста, и все разные. На Delphi я использовал для этих целей TStringGrid, и то, кривовато получалось. А в. . .
Async/await в Swift: Асинхронное программировани­е в iOS
mobDevWorks 20.03.2025
Асинхронное программирование долго было одной из самых сложных задач для разработчиков iOS. В течение многих лет мы сражались с замыканиями, диспетчеризацией очередей и обратными вызовами, чтобы. . .
Колмогоровская сложность: Приёмы упрощения кода
ArchitectMsa 20.03.2025
Наверное, каждый программист хотя бы раз сталкивался с кодом, который напоминает запутанный лабиринт — чем дальше в него погружаешься, тем сложнее найти выход. И когда мы говорим о сложности кода, мы. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru