Страниц: [1] 2 3
  Печать  
Автор Тема: Платформенно-зависимые типы в C  (Прочитано 18577 раз)
lestat
QOR.Moderator
*****
Offline Offline

Сообщений: 985


I don't trust anything


Просмотр профиля WWW
« : Июля 13, 2009, 04:00:07 pm »

Есть такой вопрос: Какие из фундаментальных типов С являются архитектурно-независимыми и имеют одинаковое представление на всех платформах?

1. int
2. unsigned int
3. float
4. double
5. long
6. unsigned long
7. Никакие из перечисленных

Как бы вы ответили на этот вопрос ?

P.S. Вопрос взят с www.quizful.net из теста начального уровня по С. Я подбирал вопросы для того чтобы можно было потестировать скиллзы студентов, меня собственно, задел именно этот вопрос.
« Последнее редактирование: Июля 13, 2009, 05:26:38 pm от lestat » Записан

AG
QOR.Moderator
*****
Offline Offline

Сообщений: 872



Просмотр профиля WWW
« Ответ #1 : Июля 13, 2009, 04:17:02 pm »

7. ибо платформеннонезавимых типов в списке нет >> uint32_t и компания.

>> С являются архитектурно-независимыми и имеют одинаковое представление на всех платформах?
Это вообще класс! А если их в память записать? А как же маленькие и большие индейцы? Вообще вопрос какой-то некорректный или не полный что ли...
Записан

A_O
Full Member
***
Offline Offline

Сообщений: 212


Просмотр профиля
« Ответ #2 : Июля 13, 2009, 04:25:37 pm »

Ничего не понял.
Там сказано, что правильный ответ - 7.
У меня возражений нет.
Или первоначально там было что-то другое, и уже поправлено?
Записан
lestat
QOR.Moderator
*****
Offline Offline

Сообщений: 985


I don't trust anything


Просмотр профиля WWW
« Ответ #3 : Июля 13, 2009, 04:28:18 pm »

Угу, я пытался им доказать, что вопрос некорректен (как раз из-за записи, либо считывания их из памяти фрагментарно, не как доступ к целому типу, ибо стандарт такой доступ не оговаривает). Второе float и double таки стандартизованы и всегда имеют одинаковый формат, как последовательность битов.
Записан

lestat
QOR.Moderator
*****
Offline Offline

Сообщений: 985


I don't trust anything


Просмотр профиля WWW
« Ответ #4 : Июля 13, 2009, 04:28:59 pm »

Ничего не понял.
Там сказано, что правильный ответ - 7.
У меня возражений нет.
Или первоначально там было что-то другое, и уже поправлено?
Да нет, как раз я считаю, что 7 - это неправильно в контексте данного вопроса.
Записан

AG
QOR.Moderator
*****
Offline Offline

Сообщений: 872



Просмотр профиля WWW
« Ответ #5 : Июля 13, 2009, 05:21:11 pm »

Второе float и double таки стандартизованы и всегда имеют одинаковый формат, как последовательность битов.

Тут ты не совсем прав.... при наличии опций типа -m96bit-long-double и -m128bit-long-double говорить о стандартизации даблов не совсем корректно. С другой стороны, те же float и double в CUDA (на самом железе NVIDIA) могут отличаться от представления в C++.
Записан

lestat
QOR.Moderator
*****
Offline Offline

Сообщений: 985


I don't trust anything


Просмотр профиля WWW
« Ответ #6 : Июля 13, 2009, 05:26:26 pm »

Не я прав Smiley Я про long double ничего не говорил.

F.2 Types
1 The C floating types match the IEC 60559 formats as follows:
— The float type matches the IEC 60559 single format.
— The double type matches the IEC 60559 double format.
— The long double type matches an IEC 60559 extended format,307) else a
non-IEC 60559 extended format, else the IEC 60559 double format.
Any non-IEC 60559 extended format used for the long double type shall have more
precision than IEC 60559 double and at least the range of IEC 60559 double.308)

long double - это тёмная лошадка ...
Записан

lestat
QOR.Moderator
*****
Offline Offline

Сообщений: 985


I don't trust anything


Просмотр профиля WWW
« Ответ #7 : Июля 13, 2009, 05:31:05 pm »

All compute-capable NVIDIA GPUs support 32-bit integer and single precision floating point arithmetic. They follow the IEEE-754 standard for single-precision binary floating-point arithmetic, with some minor differences - notably that denormalized numbers are not supported.

Т.е. для CUDA необходимо все числа приводить в диапазон -1.0...+1.0 +/- Exponent, тем не менее они тоже стандартны, иначе не было бы интеграции с C.
Записан

AG
QOR.Moderator
*****
Offline Offline

Сообщений: 872



Просмотр профиля WWW
« Ответ #8 : Июля 13, 2009, 05:50:51 pm »

Т.е. для CUDA необходимо все числа приводить в диапазон -1.0...+1.0 +/- Exponent, ...
... являются архитектурно-независимыми и имеют одинаковое представление на всех платформах?

Соответствует? ИМХО нет...
Записан

lestat
QOR.Moderator
*****
Offline Offline

Сообщений: 985


I don't trust anything


Просмотр профиля WWW
« Ответ #9 : Июля 13, 2009, 05:51:55 pm »

Это CUDA не соответствуют стандарту С Smiley Не более того.
Записан

AG
QOR.Moderator
*****
Offline Offline

Сообщений: 872



Просмотр профиля WWW
« Ответ #10 : Июля 13, 2009, 06:11:57 pm »

Это CUDA не соответствуют стандарту С Smiley Не более того.

В какой-то степени это C для GPGPU. Так что...
У интелов, на сколько мне помнится, вообще 10-байтный дабл используется для вычислений внутри FPU, так что результат не будет идентичным на разных платформах (отличных от x86)...
О полной переносимости речи быть не может. Ну и конечно же приколы с LE и BE...
Так что 7! И ни каких других вариантов.
Записан

lestat
QOR.Moderator
*****
Offline Offline

Сообщений: 985


I don't trust anything


Просмотр профиля WWW
« Ответ #11 : Июля 13, 2009, 08:03:36 pm »

Это CUDA не соответствуют стандарту С Smiley Не более того.
В какой-то степени это C для GPGPU. Так что...

У C не бывает степеней, оно либо удовлетворяет стандарту, либо нет. CUDA - это C-подобный язык.

У интелов, на сколько мне помнится, вообще 10-байтный дабл используется для вычислений внутри FPU, так что результат не будет идентичным на разных платформах (отличных от x86)...

Ты путаешь с long double.

О полной переносимости речи быть не может. Ну и конечно же приколы с LE и BE...
Тогда вопрос задан неверно, нужно было спрашивать про представление типов в памяти, а не просто представление типов, которые стандарт чётко расписывает.
Записан

ed1k
QOR.Moderator
*****
Offline Offline

Сообщений: 739


Просмотр профиля WWW
« Ответ #12 : Июля 13, 2009, 08:15:24 pm »

The right answer is 7. C standard does not really care about representation of integer or floating types; that's why there are limits.h, float.h and stdint.h mentioned in standard (ISO/IEC9899:1999(E)). That's all implementation specific and standard gives only minimal requirements by defining INT_MIN, UINT_MAX and this sort of macros which must be defined by implementation but should not be worse than those listed in standard. uint8_t is similar on most platforms (except those that can't access 8 bits at a time and work with words only) but it's not listed in 1-6; moreover if we talkinf about the broad range of platforms where C program may be compiled and run, even uint8_t may be represented differently. The order of bits forming very basic integer may be different in the real world.



Записан
A_O
Full Member
***
Offline Offline

Сообщений: 212


Просмотр профиля
« Ответ #13 : Июля 13, 2009, 09:28:34 pm »

Тогда вопрос задан неверно, нужно было спрашивать про представление типов в памяти, а не просто представление типов, которые стандарт чётко расписывает.
А что такое "просто представление типов"?
Записан
lestat
QOR.Moderator
*****
Offline Offline

Сообщений: 985


I don't trust anything


Просмотр профиля WWW
« Ответ #14 : Июля 13, 2009, 09:30:44 pm »

ed1k, ты наверное не проснулся Smiley

Не путай uint8_t и unsigned char. unsigned char может быть любого размера, а uint8_t всего 8 бит и ни битом меньше или больше, для плавающего размера есть _least_. Ещё раз, прочти стандарт, Appendix F.2, касательно float, чтобы не говорить про does not really care about representation of floating types.

Кошмар, никто даже стандарт не открывал ... Smiley
Записан

Страниц: [1] 2 3
  Печать  
 
Перейти в: