powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Явное приведение char* к int*. Вопросы.
25 сообщений из 28, страница 1 из 2
Явное приведение char* к int*. Вопросы.
    #38609212
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здравствуйте.
Дан следующий код:
Код: plaintext
1.
2.
3.
        char c = '0';
	int* temp = (int*)&c;
	printf(" %i", *temp);



Понимаю что происходит чтение 4 байт, вместо 1 байта, потому в файл вывода печатается куча, а не 0. Есть ли вообще в языках С/С++ смысл делать приведение char* к int*. И как в данном конкретном случае после приведения вывести 0. Если это возможно.

PS
Понимаю что могу прочитать 0 и без явного приведения.
...
Рейтинг: 0 / 0
Явное приведение char* к int*. Вопросы.
    #38609228
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Смысл вообще есть. Сейчас сходу такие задачи не вспомню, но бывает нужда.

А мусор в выводе у тебя получается потому что ты не понимаешь что такое стек.

Делая char c = '0' ты добавляешь на стек один байт в котором записан код символа '0'. Открой ASCII таблицу и посмотри чему это равно в десятичной и шестнадцатеричной системах.
Послы того как ты добавил на стек один байт, ты читаешь со стека четыре байта. Что в них записано до того как ты начал читать? Что-то было. И может быть даже полезное. Но ты эти три байта читаешь теперь как три старших байта от целого.

А если хочешь работающий пример, то можно так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
char c[] = "\0\0\0";
int * temp = (int*) c;

char c[4] = {0, 0, 0, 0};
int * temp = (int*) c;

char c = 0;
int temp  = c;
...
Рейтинг: 0 / 0
Явное приведение char* к int*. Вопросы.
    #38609367
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercury,
Приводить char* к int* нельзя (точнее нельзя потом разыменовывать такой указатель), кроме случая, когда известно, что char* в свою очередь приведен из int*.
...
Рейтинг: 0 / 0
Явное приведение char* к int*. Вопросы.
    #38609867
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Понял всех. Спасибо :)
...
Рейтинг: 0 / 0
Явное приведение char* к int*. Вопросы.
    #38609936
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryПонял всех.
Зацени это:
Код: sql
1.
2.
3.
4.
printf("%c\n", c);
printf("%d\n", c);
printf("%d\n", *(int*)&c);
printf("%d\n", (int)c);


Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Явное приведение char* к int*. Вопросы.
    #38609937
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть ли вообще в языках С/С++ смысл делать приведение char* к int*.

Вообще -- могут быть случаи, когда это имеет смысл.
Здесь -- нет.


И как в данном конкретном случае после приведения вывести 0. Если это возможно.

Код: plaintext
1.
2.
3.
4.
        char c = '0';
        int tempbuf = c;
	int* temp = &tempbuf;
	printf(" %i", *temp);



Не ?
...
Рейтинг: 0 / 0
Явное приведение char* к int*. Вопросы.
    #38610059
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv, строчкой
Код: plaintext
1.
int tempbuf = c;


вы делаете то от чего я как раз и хотел уйти, и почему этот вопрос и задал.

MasterZivНе ?

Нет ;)

По выводу я согласен с White Owl, тоже думал о массиве из четырёх символов.

Dimitry Sibiryakov, похоже на интересный пример, спасибо C: Компилятора с собой нет. Попробую логически порассуждать:
Код: plaintext
1.
2.
3.
4.
printf("%c\n", c);//в файл вывода 0, перенос строки
printf("%d\n", c);//думаю будет ASCII код, 48 вроде ?перенос строки
printf("%d\n", *(int*)&c);//буду читать кучу, на выходе не понятно что вероятно. Три байта в старшие разряды добавятся. А хотелось 48. И перенос строки
printf("%d\n", (int)c);//48, перенос строки



верно ?
...
Рейтинг: 0 / 0
Явное приведение char* к int*. Вопросы.
    #38610129
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryКомпилятора с собой нет
http://www.compileonline.com/compile_cpp11_online.php
...
Рейтинг: 0 / 0
Явное приведение char* к int*. Вопросы.
    #38610141
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryверно ?
Верно. А раз в стартовом посте ты хотел получить 0, то твой выбор - первая строка. Никакое
другое приведение типов 0 на выходе не даёт.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Явное приведение char* к int*. Вопросы.
    #38610207
smald
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryЗдравствуйте.
Дан следующий код:
Код: plaintext
1.
2.
3.
        char c = '0';
	int* temp = (int*)&c;
	printf(" %i", *temp);



Понимаю что происходит чтение 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 );
...
Рейтинг: 0 / 0
Явное приведение char* к int*. Вопросы.
    #38610518
interester
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть ли вообще в языках С/С++ смысл делать приведение 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 байта.
...
Рейтинг: 0 / 0
Явное приведение char* к int*. Вопросы.
    #38610619
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
smald, да, это красиво )

Код: plaintext
1.
2.
	char c = '0';
	printf("%i \n", *(int*)&c & 0x000000ff);
...
Рейтинг: 0 / 0
Явное приведение char* к int*. Вопросы.
    #38610621
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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.
//буфер
	char* s = "abcdefgklmnpt";
	char* start_s = s;
	//длина буфера
	int len_s = 0;
	while (*s++)
	{
		++len_s;
	}
	printf("len_s = %i \n", len_s);
	//искомая строка
	char* s1 = "defg";
	//читаю искомую строку как число
	int i_s1 = *(int*)s1;
	
	//поиск
	bool isExist= false;
	for (int i = 0; i < len_s-4; ++i)
	{
		if (*((int*)(start_s + i)) == i_s1)
		{
			isExist = true;
			break;
		}
	}
	printf("%i \n", isExist);



в связи с чем возникает два вопроса:
1. Действительно ли эта программа ничего не упускает и будет быстрее классического аналога для общего случая ?
2. Можно ли создать свой тип данных, для которого я смогу выделить байт столько, сколько я захочу, и нужно ли это ?
...
Рейтинг: 0 / 0
Явное приведение char* к int*. Вопросы.
    #38610625
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Запутали вы меня этой длиной строки, не нужна она тут. Такой должен быть код ;)

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
	//буфер
	char* s = "abcdefgklmnpt";
	//искомая строка
	char* s1 = "defg";
	//читаю искомую строку как число
	int i_s1 = *(int*)s1;
	
	//поиск
	bool isExist= false;
	while (*(s + 3))
	{
		if (*(int*)s == i_s1)
		{
			isExist = true;
			break;
		}
		++s;
	}
	printf("%i \n", isExist);
...
Рейтинг: 0 / 0
Явное приведение char* к int*. Вопросы.
    #38610626
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А ещё можно так ;)
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
//буфер
	char* s = "abcdefgklmnpt";
	//искомая строка
	char* s1 = "defg";
	//читаю искомую строку как число
	int i_s1 = *(int*)s1;
	
	//поиск
	int count_s1 = 0;
	while (*(s + 3))
	{
		(*(int*)s++ == i_s1)?count_s1++ : 0;
	}
	printf("%i \n", count_s1);
...
Рейтинг: 0 / 0
Явное приведение char* к int*. Вопросы.
    #38610645
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryА ещё можно так ;)
Можно но не нужно. Не самый лучший подход с точки зрения производительности.

Есть стандартные функции поиска strstr() и strchr()
...
Рейтинг: 0 / 0
Явное приведение char* к int*. Вопросы.
    #38610695
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercury1. Действительно ли эта программа ничего не упускает и будет быстрее классического аналога для общего случая ?
Читать по словам, а не по байтам действительно ускоряет.
Но надо помнить, что если слова не выровнены в памяти (упрощенно: если адрес слова не кратен размеру слова) то на некоторых платформах программа упадет, а на некоторых будет медленнее работать.

SashaMercury2. Можно ли создать свой тип данных, для которого я смогу выделить байт столько, сколько я захочу, и нужно ли это ?
Можно:)
Код: plaintext
1.
struct  A {  char buf[1024];} ;


Ну а если вы имели в виду создать числовой тип данных с произвольным размером, то - нельзя.
...
Рейтинг: 0 / 0
Явное приведение char* к int*. Вопросы.
    #38610701
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyЧитать по словам, а не по байтам действительно ускоряет.
Это если читаешь конкретный байт однократно, тут же каждый байт 4 раза читается, как часть разных слов.
...
Рейтинг: 0 / 0
Явное приведение char* к int*. Вопросы.
    #38610755
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TЭто если читаешь конкретный байт однократно, тут же каждый байт 4 раза читается, как часть разных слов.
Я просто в код не вчитывался :)
В этом случае действительно смысла нет.
...
Рейтинг: 0 / 0
Явное приведение char* к int*. Вопросы.
    #38610816
smald
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TЕсть стандартные функции поиска

Загляните в их исходники.
...
Рейтинг: 0 / 0
Явное приведение char* к int*. Вопросы.
    #38610832
smald
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercury2. Можно ли создать свой тип данных, для которого я смогу выделить байт столько, сколько я захочу, и нужно ли это ?

Вы как не русский. В С++ это не только можно, но и относится к его бест практикс.
Класс с полями и переопределёнными операторами. И у Вас свой тип данных с которыми
Вы вольны делать обычные операции вроде +/- но под капотом будут проворачиваться
самые разные хаки. А, вообще, писать всякие хотелки, вроде той, что в теме, наиболее
удобно и безопасно на чистом asm. Можно оформить процедуры с С-шным интерфейсом,
можно asm вставками. И там у вас запарки по поводу соответствия указателей и областей памяти,
не будет.
...
Рейтинг: 0 / 0
Явное приведение char* к int*. Вопросы.
    #38610841
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
smaldDima TЕсть стандартные функции поиска

Загляните в их исходники.
И что там смотреть?

Вот исходник strstr()
...
Рейтинг: 0 / 0
Явное приведение char* к int*. Вопросы.
    #38610888
smald
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TИ что там смотреть?



Да то же самое побайтовое сравнение, без Муров и regex автоматов.
Только оно ещё и инлайниться не будет.
...
Рейтинг: 0 / 0
Явное приведение char* к int*. Вопросы.
    #38611418
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В таком случае, какая из функций отработает быстрее и почему ?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
int cmpint(int a,int b)
{
     return (a>b)?a:b;
}
char cmpchar(char a,char b)
{
     return (a>b)?a:b;
}



подозреваю что 1 байт сравнивается быстрее, и сравнение происходит побитово, а может быть происходит отрицание побитовой суммы по модулю два. Так ли это ?
...
Рейтинг: 0 / 0
Явное приведение char* к int*. Вопросы.
    #38611459
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryподозреваю что 1 байт сравнивается быстрее, и сравнение происходит побитово, а может быть происходит отрицание побитовой суммы по модулю два. Так ли это ?
Скорее всего одинаково. Потому что производители процессоров от побитового сравнения давным давно ушли далеко вперед. Как оно там реально сравнивается - это вопрос к разработчикам процессоров.
...
Рейтинг: 0 / 0
25 сообщений из 28, страница 1 из 2
Форумы / C++ [игнор отключен] [закрыт для гостей] / Явное приведение char* к int*. Вопросы.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]