- 1
- 2
- 3
- 4
- 5
//...
float a = 7;
printf("%d", *(unsigned int *)(&a) >> 23);
// Что напечатает?
//...
Нашли или выдавили из себя код, который нельзя назвать нормальным, на который без улыбки не взглянешь? Не торопитесь его удалять или рефакторить, — запостите его на говнокод.ру, посмеёмся вместе!
+136
//...
float a = 7;
printf("%d", *(unsigned int *)(&a) >> 23);
// Что напечатает?
//...
На экзамене как-то задали такой вопрос. А ну-ка, кто без компилятора ответит?
3.14159265 18.02.2014 01:55 # +1
bormand 18.02.2014 06:29 # 0
bormand 18.02.2014 06:36 # +6
Dummy00001 18.02.2014 14:45 # 0
Soul_re@ver 18.02.2014 15:53 # 0
Konardo 18.02.2014 15:55 # −17
kipar 18.02.2014 16:14 # 0
Dummy00001 18.02.2014 16:17 # 0
someone 18.02.2014 06:12 # +5
http://blog.llvm.org/2011/05/what-every-c-programmer-should-know.html
bormand 18.02.2014 06:32 # +3
TarasB 18.02.2014 11:14 # +3
слушай, попробуй в tbarr.h исправить и на гцц пересобрать, может баги исчезнут?
bormand 18.02.2014 13:55 # +2
TarasB 18.02.2014 13:59 # −1
Я двум людям 10 раз сказал, что глюки на ГЦЦ и Интеле, которых нет в Студии - это 95% что из-за тарасомассива, который переосмысливающе преобразует uint8_t* в T*. Они ничего не ответили. Я вот сегодня погуглил - интересно, если я поменяю uint8_t на тупо char, то мне полегчает? Типа там сказали, что для указателей, полученных из char*, компилятор не имеет права считать их заведомо разными.
guest 18.02.2014 14:02 # +1
TarasB 18.02.2014 14:03 # 0
Konardo 18.02.2014 14:15 # −15
Konardo 18.02.2014 14:15 # −15
bormand 18.02.2014 14:10 # 0
Если я правильно понимаю правила алиасинга - компилятору вообще похуй, каким образом получен указатель.
Есть у тебя в коде два обращения к данным через два разных указателя (например *p = 42; и int x = *q). Компилятор имеет полное право поменять эти два обращения местами, за исключением описанных в стандарте случаев. А случаи эти - если один из указателей char* или если эти типы целые одного размера (т.е., к примеру, int и unsigned int). (Там вроде еще случаи есть, но я их не помню, прочти список в стандарте).
А кастовать - да хоть закастуйся, влияют только сами обращения через указатель.
TarasB 18.02.2014 14:13 # −1
Konardo 18.02.2014 14:16 # −15
bormand 18.02.2014 14:16 # 0
Вечерком почитаю, если не заиграюсь в AC4.
Konardo 18.02.2014 14:16 # −15
TarasB 18.02.2014 14:20 # −1
А куда высылать-то? Ты на крестофоруме в личку напиши хоть.
bormand 18.02.2014 14:21 # 0
[email protected]
TarasB 18.02.2014 14:26 # 0
Konardo 18.02.2014 14:31 # −14
Konardo 18.02.2014 14:31 # −14
Konardo 18.02.2014 14:31 # −13
bormand 18.02.2014 17:56 # 0
Но меня там нет :(
laMer007 18.02.2014 18:20 # 0
Ну как же можно не пройти тест на гейдевелопера? 6 вопросов всего.
laMer007 18.02.2014 14:54 # 0
Что это?
Stertor 18.02.2014 14:56 # 0
Пощади, Бормандт, я больше не буду троллить...
bormand 18.02.2014 17:51 # +2
Asassin Assasin Assassin Creed.
anonimb84a2f6fd141 18.02.2014 18:06 # −1
anonimb84a2f6fd141 18.02.2014 18:07 # −2
Stertor 18.02.2014 18:16 # +1
bormand 18.02.2014 14:13 # 0
TarasB 18.02.2014 14:15 # −1
Ещё несколько раз static_cast от родителя к потомку.
Блин, если б у меня был компилятор, который воспроизводит баг, и с которым я умею работать, я б поковырял. А так народ видит, что у меня баг, а копать, конечно же, мой код не хочет, ибо не своё.
bormand 18.02.2014 14:19 # +1
Ну если это единичный объект, и ты обеспечил гарантию, что там находится этот потомок - все норм.
А вот кастовать массив из Base* в массив из Derived* (да и наоборот тоже) категорически запрещено:
Konardo 18.02.2014 14:31 # −15
TarasB 18.02.2014 14:35 # +3
нет, такого нет
есть
И ещё есть
Да, и все [i] - это индексы в тарасомассиве
Konardo 18.02.2014 14:16 # −14
Konardo 18.02.2014 14:15 # −14
Konardo 18.02.2014 14:15 # −14
Konardo 18.02.2014 14:15 # −14
Konardo 18.02.2014 14:15 # −14
Konardo 18.02.2014 14:15 # −13
roman-kashitsyn 18.02.2014 07:41 # +2
someone 18.02.2014 07:49 # +3
guest 18.02.2014 08:45 # +1
roman-kashitsyn 18.02.2014 08:50 # +7
guest 18.02.2014 08:46 # +4
3.14159265 18.02.2014 13:08 # 0
Интуитивно предчувствовал это!
Konardo 18.02.2014 14:15 # −15
Konardo 18.02.2014 09:17 # −17
TarasB 18.02.2014 11:15 # +4
Я не отвечу, не помню я сколько бит там что значат и с какого числа они нумеруются.
Я даже не знаю, что означает нулевая экспонента - 1, 0.5, или 2, там кажись сдвиг есть.
Konardo 18.02.2014 11:16 # −14
guest 18.02.2014 11:32 # +6
Konardo 18.02.2014 11:38 # −13