LINUX.ORG.RU

Детский вопрос о работе с шеснадцатеричном представлении числа


0

1

Собственно вопрос заключается в том, что до меня не доходит как работать с шеснадцатиричным представлением числа в си.

#include<stdio.h>

int main (void)
{
int d;
for (d='\x1'; d=='\xff'; d++)
printf («%d\n», d);

return (0);
}

Почему это не работает???

Вопрос 2: Как через argv передать шестнадцатиричное число??



Последнее исправление: sCat (всего исправлений: 1)

> Почему это не работает???

А почему оно должно работать? Условие d=='\xff' никогда не выполняется.

tailgunner ★★★★★
()

1. 16-ричные числа записываются как 0xABCD без кавычек
2. argv - массив ссылок на строки. соответственно использовать надо строковые функции, sscanf, например.

illifant
()

> Почему это не работает???

ты будешь шокирован, может даже застрелишься (надеюсь), но 1 ≠ 255… наука высших сфер, все дела, тебе не понять…

> Вопрос 2: Как через argv передать шестнадцатиричное число??

передай шестнадцатеричное значение.

arsi ★★★★★
()
Ответ на: комментарий от illifant

1. Может я неправильно понял Керниигана..... Там #define DDD '\xhh' -где hh это произвольный шеснадцатиричный код... .....именно в кавычках... 2. про scanf понял... и даже помню, но!!! Разве нельзя взять строку из argv и сделав с ней нехиттрые преобразования получить переменную типа int. C одиночным символом это сделать можно. s-'0' (опять-же Керниган) А если с двумя??? Можно-ли разобрать строку из argv и записать в массив по одному элементу и так... далее..далее...

sCat
() автор топика
#include<stdio.h>

int main (void)
{ 
  int d;
  for (d=0x1; d<=0xff; d++)
    printf ("%x\n", d);
  
  return (0);
}

УМВР

kim-roader ★★
()
#include <stdio.h>
#include <limits.h>

int main(void)
{
	char hex;
	for (hex=CHAR_MIN; hex < CHAR_MAX; hex++)
		printf("%X==%d\n", hex, hex);
	return 0;
}

2. Можно передать как целое и получить как целое, затем привести в 16ричный вид.

sched
()
Ответ на: комментарий от arsi

Суть не в ==. Это «немного кода» я переписывал 385 раз.... не исключены и такие глупые ошибки...

sCat
() автор топика
Ответ на: комментарий от PolarFox

Да спасибо.

Все-таки d='\xf' таки выдала 15.

sCat
() автор топика
Ответ на: комментарий от arsi

>боже, роди ТСа обратно…

Предварительно сделав delete, а то будет утечка китайцев.

По теме - ТС, внимаетльно прочитай про представления данных и их конвертацию.

visual ★★★
()
Ответ на: комментарий от mrcim

>Вручную разбить текст вида «0xa1b» КАК!!!!!!!!!!!!????????? Если argv выдает строку.!!!!!!!?????????

КАК!!!!!!!?????

Немудрено, что на такие детские вещи, профи обращают мало внимания...

sCat
() автор топика
Ответ на: комментарий от sCat

Он выдает массив символов а не строку, а именно char, и доступ к символу можно получить банально char[n] где n - номер символа. Возможно подобная функция и есть в какой-то неипической библиотеке, но я не хочу сейчас искать, и что думают по этому поводу профи мне ровно - победителей не судят.

mrcim
()
Ответ на: комментарий от sCat

sscanf, если самому парсер писать не хочется.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от mrcim

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

.... Вопрос исчерпан. Тему закрываю.

sCat
() автор топика

Вопрос 2: Как через argv передать шестнадцатиричное число??

вот так и передавай строку 0xF3 а затем scanf(argv[], «0x%02X», &d); или что-то в этом роде, не понимаю реально в чем у тебя затруднения-то

I-Love-Microsoft ★★★★★
()
Ответ на: комментарий от I-Love-Microsoft

Хотел сам «парсер» написать для конкретного случая. Но не знал как. И все. Тупо для лучшего понимания процесса передачи аргументов. Ну и то что кавычки в выражении #define GGG '\xff' ввели в заблуждение относительно того, как в теле программы вводить шестнадцатиричное число.

sCat
() автор топика
Ответ на: комментарий от sCat

я не знаю что такое шестнадцатеричное число, я знаю только такое представление одного и того же числа, в частности в ПК хранится исключительно в бинарном виде

0x2D или 45 или 55 восьмеричное - это будет всё то же 45 и все то же 101101

I-Love-Microsoft ★★★★★
()
Ответ на: комментарий от I-Love-Microsoft

>частности в ПК хранится исключительно в бинарном виде
нет. в ПК оно хранится в виде разности зарядов.

а вот уже людям это проще понимать и записывать в двоичном, восьмеричном, десятеричном, шестнадцетеричном и других счисленияю. сами же числа, от этого не меняются.

AGUtilities ★★★
()

по теме: как и сказали выше, в коде Си, 16-е числа записываются с 0x перед собственно числом.

если речь идёт о переводе из стринга в число, то есть специальные библиотеки и функции, по моему даже в glibc есть.

AGUtilities ★★★
()
Ответ на: комментарий от visual

>боже, роди ТСа обратно…

Предварительно сделав delete, а то будет утечка китайцев.

Индусов. Китайский код был бы более прямолинеен:

printf ("%d\n", (int)'\x1');
printf ("%d\n", (int)'\x2');
printf ("%d\n", (int)'\x3');
printf ("%d\n", (int)'\x4');
/*
.
.
.
*/
printf ("%d\n", (int)'\xff');

geekless ★★
()

Использую для конвертации из текстового вида в бинарный

string h2s(string s) {
        string dst;
        string tmp;
        unsigned i;
        for (i=0; i<(s.length()/2); i++) {
          tmp = s[i*2];
          tmp += s[i*2+1];
          dst += (unsigned char) strtol(tmp.c_str(), NULL, 16);
        }
        return dst;
}

Это дело легко из плюсов конвертится в обычные С

Jetty ★★★★★
()
Ответ на: комментарий от AGUtilities

ты меня не так понял, я как раз хотел поспорить с тем что двоичное представление это лишь одно из ряда который ты перечислил

я считаю что в современных цифровых устройствах двоичный код как раз и является родным, физическим способом хранения информации, это не просто представление :)

I-Love-Microsoft ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.