Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Явное приведение char* к int*. Вопросы.
|
|||
|---|---|---|---|
|
#18+
Здравствуйте. Дан следующий код: Код: plaintext 1. 2. 3. Понимаю что происходит чтение 4 байт, вместо 1 байта, потому в файл вывода печатается куча, а не 0. Есть ли вообще в языках С/С++ смысл делать приведение char* к int*. И как в данном конкретном случае после приведения вывести 0. Если это возможно. PS Понимаю что могу прочитать 0 и без явного приведения. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.04.2014, 05:07 |
|
||
|
Явное приведение char* к int*. Вопросы.
|
|||
|---|---|---|---|
|
#18+
Смысл вообще есть. Сейчас сходу такие задачи не вспомню, но бывает нужда. А мусор в выводе у тебя получается потому что ты не понимаешь что такое стек. Делая char c = '0' ты добавляешь на стек один байт в котором записан код символа '0'. Открой ASCII таблицу и посмотри чему это равно в десятичной и шестнадцатеричной системах. Послы того как ты добавил на стек один байт, ты читаешь со стека четыре байта. Что в них записано до того как ты начал читать? Что-то было. И может быть даже полезное. Но ты эти три байта читаешь теперь как три старших байта от целого. А если хочешь работающий пример, то можно так: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.04.2014, 06:48 |
|
||
|
Явное приведение char* к int*. Вопросы.
|
|||
|---|---|---|---|
|
#18+
SashaMercury, Приводить char* к int* нельзя (точнее нельзя потом разыменовывать такой указатель), кроме случая, когда известно, что char* в свою очередь приведен из int*. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.04.2014, 09:59 |
|
||
|
Явное приведение char* к int*. Вопросы.
|
|||
|---|---|---|---|
|
#18+
Понял всех. Спасибо :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.04.2014, 13:48 |
|
||
|
Явное приведение char* к int*. Вопросы.
|
|||
|---|---|---|---|
|
#18+
SashaMercuryПонял всех. Зацени это: Код: sql 1. 2. 3. 4. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.04.2014, 14:26 |
|
||
|
Явное приведение char* к int*. Вопросы.
|
|||
|---|---|---|---|
|
#18+
Есть ли вообще в языках С/С++ смысл делать приведение char* к int*. Вообще -- могут быть случаи, когда это имеет смысл. Здесь -- нет. И как в данном конкретном случае после приведения вывести 0. Если это возможно. Код: plaintext 1. 2. 3. 4. Не ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.04.2014, 14:27 |
|
||
|
Явное приведение char* к int*. Вопросы.
|
|||
|---|---|---|---|
|
#18+
MasterZiv, строчкой Код: plaintext 1. вы делаете то от чего я как раз и хотел уйти, и почему этот вопрос и задал. MasterZivНе ? Нет ;) По выводу я согласен с White Owl, тоже думал о массиве из четырёх символов. Dimitry Sibiryakov, похоже на интересный пример, спасибо C: Компилятора с собой нет. Попробую логически порассуждать: Код: plaintext 1. 2. 3. 4. верно ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.04.2014, 15:28 |
|
||
|
Явное приведение char* к int*. Вопросы.
|
|||
|---|---|---|---|
|
#18+
SashaMercuryКомпилятора с собой нет http://www.compileonline.com/compile_cpp11_online.php ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.04.2014, 15:53 |
|
||
|
Явное приведение char* к int*. Вопросы.
|
|||
|---|---|---|---|
|
#18+
SashaMercuryверно ? Верно. А раз в стартовом посте ты хотел получить 0, то твой выбор - первая строка. Никакое другое приведение типов 0 на выходе не даёт. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.04.2014, 15:58 |
|
||
|
Явное приведение char* к int*. Вопросы.
|
|||
|---|---|---|---|
|
#18+
SashaMercuryЗдравствуйте. Дан следующий код: Код: plaintext 1. 2. 3. Понимаю что происходит чтение 4 байт, вместо 1 байта, потому в файл вывода печатается куча, а не 0. Есть ли вообще в языках С/С++ смысл делать приведение char* к int*. И как в данном конкретном случае после приведения вывести 0. Если это возможно. PS Понимаю что могу прочитать 0 и без явного приведения. Смысл только в том, чтоб поприкалываться. int* temp = (int*)&c;-temp указывает на на область памяти в sizeof(int), самым младшим байтом будет тот, что заполнен символом '0', далее в порядке возрастания своего адреса ещё три байта, в котором может быть что угодно, например, адрес возврата, часть его, вернее. В x86 байту с младшим адресом соответствуют младшие разряды числа, которое сохранено в последовательности sizeof(int) байт. Поэтому в int A=*temp, биты символа char c занимают восемь младших разрядов вывода: printf("RES==%x\n", *temp). Можно вылечить так: printf("RES==%c\n", *temp & 0x000000ff ); ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.04.2014, 16:30 |
|
||
|
Явное приведение char* к int*. Вопросы.
|
|||
|---|---|---|---|
|
#18+
Есть ли вообще в языках С/С++ смысл делать приведение char* к int* Навскидку приведу пример: поиск в строке s подстроки s1, причем известно, что s1 состоит из 4 символов. Тогда можно обойтись одним циклом int i=0, val=*(int*)s1; for(; i< strlen(s)-4; ++i) if ( *((int*)(s+i)) == val){ found=1; break; } Здесь предполагается, что размер char- 1 байт, int - 4 байта. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.04.2014, 22:18 |
|
||
|
Явное приведение char* к int*. Вопросы.
|
|||
|---|---|---|---|
|
#18+
smald, да, это красиво ) Код: plaintext 1. 2. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.04.2014, 02:16 |
|
||
|
Явное приведение char* к int*. Вопросы.
|
|||
|---|---|---|---|
|
#18+
interester, отличный пример, написал его в более приличном виде Код: plaintext 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. в связи с чем возникает два вопроса: 1. Действительно ли эта программа ничего не упускает и будет быстрее классического аналога для общего случая ? 2. Можно ли создать свой тип данных, для которого я смогу выделить байт столько, сколько я захочу, и нужно ли это ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.04.2014, 02:20 |
|
||
|
Явное приведение char* к int*. Вопросы.
|
|||
|---|---|---|---|
|
#18+
Запутали вы меня этой длиной строки, не нужна она тут. Такой должен быть код ;) Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.04.2014, 02:35 |
|
||
|
Явное приведение char* к int*. Вопросы.
|
|||
|---|---|---|---|
|
#18+
А ещё можно так ;) Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.04.2014, 02:53 |
|
||
|
Явное приведение char* к int*. Вопросы.
|
|||
|---|---|---|---|
|
#18+
SashaMercuryА ещё можно так ;) Можно но не нужно. Не самый лучший подход с точки зрения производительности. Есть стандартные функции поиска strstr() и strchr() ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.04.2014, 06:43 |
|
||
|
Явное приведение char* к int*. Вопросы.
|
|||
|---|---|---|---|
|
#18+
SashaMercury1. Действительно ли эта программа ничего не упускает и будет быстрее классического аналога для общего случая ? Читать по словам, а не по байтам действительно ускоряет. Но надо помнить, что если слова не выровнены в памяти (упрощенно: если адрес слова не кратен размеру слова) то на некоторых платформах программа упадет, а на некоторых будет медленнее работать. SashaMercury2. Можно ли создать свой тип данных, для которого я смогу выделить байт столько, сколько я захочу, и нужно ли это ? Можно:) Код: plaintext 1. Ну а если вы имели в виду создать числовой тип данных с произвольным размером, то - нельзя. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.04.2014, 08:44 |
|
||
|
Явное приведение char* к int*. Вопросы.
|
|||
|---|---|---|---|
|
#18+
Anatoly MoskovskyЧитать по словам, а не по байтам действительно ускоряет. Это если читаешь конкретный байт однократно, тут же каждый байт 4 раза читается, как часть разных слов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.04.2014, 08:55 |
|
||
|
Явное приведение char* к int*. Вопросы.
|
|||
|---|---|---|---|
|
#18+
Dima TЭто если читаешь конкретный байт однократно, тут же каждый байт 4 раза читается, как часть разных слов. Я просто в код не вчитывался :) В этом случае действительно смысла нет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.04.2014, 09:49 |
|
||
|
Явное приведение char* к int*. Вопросы.
|
|||
|---|---|---|---|
|
#18+
Dima TЕсть стандартные функции поиска Загляните в их исходники. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.04.2014, 10:26 |
|
||
|
Явное приведение char* к int*. Вопросы.
|
|||
|---|---|---|---|
|
#18+
SashaMercury2. Можно ли создать свой тип данных, для которого я смогу выделить байт столько, сколько я захочу, и нужно ли это ? Вы как не русский. В С++ это не только можно, но и относится к его бест практикс. Класс с полями и переопределёнными операторами. И у Вас свой тип данных с которыми Вы вольны делать обычные операции вроде +/- но под капотом будут проворачиваться самые разные хаки. А, вообще, писать всякие хотелки, вроде той, что в теме, наиболее удобно и безопасно на чистом asm. Можно оформить процедуры с С-шным интерфейсом, можно asm вставками. И там у вас запарки по поводу соответствия указателей и областей памяти, не будет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.04.2014, 10:37 |
|
||
|
Явное приведение char* к int*. Вопросы.
|
|||
|---|---|---|---|
|
#18+
smaldDima TЕсть стандартные функции поиска Загляните в их исходники. И что там смотреть? Вот исходник strstr() ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.04.2014, 10:45 |
|
||
|
Явное приведение char* к int*. Вопросы.
|
|||
|---|---|---|---|
|
#18+
Dima TИ что там смотреть? Да то же самое побайтовое сравнение, без Муров и regex автоматов. Только оно ещё и инлайниться не будет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.04.2014, 11:17 |
|
||
|
Явное приведение char* к int*. Вопросы.
|
|||
|---|---|---|---|
|
#18+
В таком случае, какая из функций отработает быстрее и почему ? Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. подозреваю что 1 байт сравнивается быстрее, и сравнение происходит побитово, а может быть происходит отрицание побитовой суммы по модулю два. Так ли это ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.04.2014, 15:56 |
|
||
|
Явное приведение char* к int*. Вопросы.
|
|||
|---|---|---|---|
|
#18+
SashaMercuryподозреваю что 1 байт сравнивается быстрее, и сравнение происходит побитово, а может быть происходит отрицание побитовой суммы по модулю два. Так ли это ? Скорее всего одинаково. Потому что производители процессоров от побитового сравнения давным давно ушли далеко вперед. Как оно там реально сравнивается - это вопрос к разработчикам процессоров. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.04.2014, 16:12 |
|
||
|
Явное приведение char* к int*. Вопросы.
|
|||
|---|---|---|---|
|
#18+
SashaMercuryВ таком случае, какая из функций отработает быстрее и почему ? Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. подозреваю что 1 байт сравнивается быстрее, и сравнение происходит побитово, а может быть происходит отрицание побитовой суммы по модулю два. Так ли это ? Смотрите, это скомпиленные Ваши функции: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. А теперь покажите на этом коде, почему 1B будут сравниваться быстрее. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.04.2014, 16:18 |
|
||
|
Явное приведение char* к int*. Вопросы.
|
|||
|---|---|---|---|
|
#18+
я не силён в ассемблере. Но судя по этому коду, 1 Байт не будет сравниваться быстрее. Больше команд mov. Меня выгоняют спать :( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.04.2014, 16:32 |
|
||
|
|

start [/forum/topic.php?all=1&fid=57&tid=2019552]: |
0ms |
get settings: |
8ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
74ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
60ms |
get tp. blocked users: |
2ms |
| others: | 294ms |
| total: | 468ms |

| 0 / 0 |
