Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Как работает memset()?  (Прочитано 14193 раз)
0 Пользователей и 6 Гостей смотрят эту тему.
Alex1010
Гость
« : 23-03-2004 20:54 » 

Hi All!
Как работает memset()?
Есть код:

int buffer[2];
    buffer[0]=300;
    buffer[1]=6;

memset(buffer,0,1);
printf("Buffer after memset: %d\n" *buffer);

Компилятор Borland v3.1
int - 2 байта. Т.е. buffer[0]: 00000001 00101100
Насколько я понимаю функция в данном случае обнулит 1 байт, значит получится 00000000 00101100, т.е. 44 в десятичном. А результат выводит 256. И так для диапазона 256-511. Дальше 512 и т.д.
Записан
ysv_
Помогающий

ua
Offline Offline

« Ответ #1 : 24-03-2004 10:32 » 

Цитата

int - 2 байта. Т.е. buffer[0]: 00000001 00101100

Не правильно. Это big endian format (байты идут от старшых к младшым), а в Интелловских процессорах используется little endian format (байты идут от младших к старшим), т. е. Т.е. buffer[0]: 00101100 00000001.
Так что memset работает как положено.
Записан
Alex1010
Гость
« Ответ #2 : 25-03-2004 18:00 » 

А почему результат 256? :?:
Записан
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #3 : 25-03-2004 18:08 » 

Alex1010, читай внимательнее - ysv_ причину описал.
Для наглядности: int buffer=300;
В шестнадцатеричном виде это 0x12C . Для процессоров семейства x86 (на котором таботает твой PC) размер int равен 4-ом байтам и распалагается в памяти начиная с младнего байта: 0x2c,0x01,0x00,0x00 . Когда ты записал в первый байт 0, то значение buffer стало 0x100, или 256.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Alex1010
Гость
« Ответ #4 : 26-03-2004 07:54 » 

Цитата

Когда ты записал в первый байт 0, то значение buffer стало 0x100, или 256.

Извините за мое торможение, но почему 0x100, а не 0x10000? Имеется введу 0x00,0x01,0x00,0x00.
Записан
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #5 : 26-03-2004 10:18 » 

Alex1010, потому что записывая число в ячейку памяти ты изменяешь только эту ячейку, а не сдвигаешь соседние (как мне показалось, ты так воспринял).
Или я тебя не правильно понял? Ты опять про порядок байт в памяти?
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Alex1010
Гость
« Ответ #6 : 26-03-2004 12:39 » 

Ну например есть int buffer=300;
Это значит в двоичном:
00000000 00000000 00000001 00101100
В памяти:
00101100 00000001 00000000 00000000
Изменяем первый байт на 0:
00000000 00000001 00000000 00000000
Имеем:
1 0000000 00000000 (в двоичном)
65536 (в десятичном)
Записан
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #7 : 26-03-2004 13:10 » new

Alex1010, прочти все что я писал еще раз и внимательнее.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
xAL
Гость
« Ответ #8 : 26-03-2004 13:58 » 

Alex1010, немного ошибся Улыбаюсь

Исправленный вариант:

---
Ну например есть int buffer=300;
Это значит в двоичном:
00000000 00000000 00000001 00101100
В памяти:
00101100 00000001 00000000 00000000
Изменяем первый байт на 0:
00000000 00000001 00000000 00000000
Имеем (перевернув байты обратно):
00000000 00000000 00000001 00000000
== 256 в десятичной
---

Так, ради информации для Alex1010... идея такого вида хранения данных в памяти: старшим байтам в записи числа соответствуют старшие (большие) адреса памяти. Иногда удобно, когда long число 2 можно без потерь информации конвертировать, например, в 2 char-овское...

Но это так, ради информации, если не знал Улыбаюсь
Записан
Alex1010
Гость
« Ответ #9 : 26-03-2004 19:29 » 

А-а-а-а-а!!! Вот это я не внимателен!  Улыбаюсь
Спасибо!
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines