LINUX.ORG.RU

Подскажите по С


0

1

Почему здесь возвращается вместо 65535 - 4294967295?

Код:

#include <stdio.h>
  main(){
  unsigned char ch1=0xFF;
  signed char ch2=0xFF;
  short int i;

i=ch1;/*unsigned char превращается в int*/ 
printf(«%d\n»,i); /* выведет 255 */ i=ch2; /* signed char превращается в int*/ 
printf(«%d\n»,i); /* выведет -1 */ 
printf(«%u\n»,i); /* выведет 65535 */
}

Добаляя в конец строки:

printf(«0x%x\n»,i);
printf(«Размер: %d\n»,sizeof(i));

выдает:

0xffffffff
Размер: 2

потому-что unsigned имеет размер 32 бита, а твоя книжка старая, в ТЕ времена было 16 бит. Скоро int будет 64 бита, и соответственно unsigned будет ажно до 18446744073709551615и

drBatty ★★
()

sizeof(i)

про sizeof можно сказать лишь то, что sizeof(char) == 1. sizeof остальных типов НЕ МЕНЬШЕ 1. Ну у тебя 2 получилось для short, всё правильно, это НЕ МЕНЬШЕ одного. Могло получится 1 или Over9000.

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

так последние две строки и показывают, что размер переменной 2 байта (16 бит), а значение выводится 0xffffffff - 32 битное ...

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

так последние две строки и показывают, что размер переменной 2 байта (16 бит), а значение выводится 0xffffffff - 32 битное ...

man 3 printf

o, u, x, X

The unsigned int argument is converted to unsigned octal (o), unsigned decimal (u), or unsigned hexadecimal (x and X) notation. The letters abcdef are used for x conversions; the letters ABCDEF are used for X conversions. The precision, if any, gives the minimum number of digits that must appear; if the converted value requires fewer digits, it is padded on the left with zeros. The default precision is 1. When 0 is printed with an explicit precision 0, the output is empty.

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

man printf

надо man 3 printf, потому-что есть man 1 printf, а это не то.

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

смысл вопроса в том, - почему размер переменной 2 байта, а значение в ней - 4 байта?

потому-что ты сам попросил вывести int, а не short

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

При передаче аргументов в функцию без прототипа или с переменным числом параметров (printf, например) целые значения расширяются до размера int (или unsigned).

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

смысл вопроса в том, - почему размер переменной 2 байта, а значение в ней - 4 байта?

потому-что printf(3) не знает, что ты ей подсунул short, и выводит unsigned int, как ты ей приказал. Там неявное преобразование short -> unsigned.

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

При передаче аргументов в функцию без прототипа или с переменным числом параметров (printf, например) целые значения расширяются до размера int (или unsigned).

во ...! Похоже на истину. Т.е. сама функция «мудрит» ... А как в данном случае вывести значение (short)?

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

При передаче аргументов в функцию без прототипа или с переменным числом параметров (printf, например) целые значения расширяются до размера int (или unsigned).

неправильно. В функции с ... вместо параметра размер определяется макросом va_arg().

man va_arg

va_arg() The va_arg() macro expands to an expression that has the type and value of the next argument in the call. The argument ap is the va_list ap initialized by va_start(). Each call to va_arg() modifies ap so that the next call returns the next argument. The argument type is a type name specified so that the type of a pointer to an object that has the specified type can be obtained simply by adding a * to type.

The first use of the va_arg() macro after that of the va_start() macro returns the argument after last. Successive invocations return the values of the remaining arguments.

If there is no next argument, or if type is not compatible with the type of the actual next argument (as promoted according to the default argument promotions), random errors will occur.

If ap is passed to a function that uses va_arg(ap,type) then the value of ap is undefined after the return of that function.

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

Похоже на истину.

вы, деточки, не осилили K&R.

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

А как в данном случае вывести значение (short)?

в твоём случае %hu

PS: RTFM!

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

а прочитать то, что цитируешь, слабо?

as promoted according to the default argument promotions

функция получает int (unsigned), а как она его будет интерпретировать при помощи va_arg - её внутреннее дело.

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

функция получает int (unsigned), а как она его будет интерпретировать при помощи va_arg - её внутреннее дело.

мы не про «абстрактную функцию», а про вполне конкретную printf(3).

Ну и вообще, надеяться на то, что функция получает unsigned, это ИМХО быдлокодерство.

drBatty ★★
()

У меня от такого форматирования кода друг умер. Будь осторожнее там, ладно?

nanoolinux ★★★★
()

Срочно коммитить в ядро!

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