jsn: (common)
[personal profile] jsn

[несколько слов пропущено, потому что они все нецензурные]

jason@jsn c $ cat r.c
#include <stdio.h>

#define B (sizeof(int) * 8)
int _ = B ;
int f(void) { return _ ; }

unsigned g(unsigned x) {
    printf("x == %d, ", x) ;
    return 1 << (B - x) ;
}

int main(int ac, const char *av[]) {
    printf("g(x) == %d\n", g(0)) ;
    printf("g(x) == %d\n", g(B - f())) ;
    return 0 ;
}
jason@jsn c $ gcc -o r r.c && ./r
x == 0, g(x) == 1
x == 0, g(x) == 1
jason@jsn c $ gcc -O2 -o r r.c && ./r
x == 0, g(x) == 0
x == 0, g(x) == 1
jason@jsn c $ clang -o r r.c && ./r
x == 0, g(x) == 1
x == 0, g(x) == 1
jason@jsn c $ clang -O2 -o r r.c && ./r
x == 0, g(x) == 0
x == 0, g(x) == 1
jason@jsn c $ 

Это, что, считается нормально теперь? Там, что, в стандарте действительно сказано, что overflowing left shift result is undefined? И "undefined" следует интерпретировать как "ведёт себя по-разному в соседних строчках кода?"

Date: 2013-02-14 03:03 pm (UTC)
From: [identity profile] trurle.livejournal.com
Это, что, считается нормально теперь?

Не только теперь, но с 1973 года. C language: enabling shooting yourself in the foot for 40 bloody years!

Date: 2013-02-14 03:07 pm (UTC)
From: [identity profile] alexott.livejournal.com
"1972 - Dennis Ritchie invents a powerful gun that shoots both forward and backward simultaneously. Not satisfied with the number of deaths and permanent maimings from that invention he invents C and Unix."

Date: 2013-02-14 03:24 pm (UTC)
From: [identity profile] ilya-dogolazky.livejournal.com
Я вот не понимаю этих шуточек, пример со сдвигом как раз показывает очень большое достоинство языка Си --- он выполняет сдвиг одной единственной инструкцией (где может). Сделать это (на i386 к примеру) с различением сдвига на 0 и сдвига на 32 разряда невозможно, вот он и не делает, причём честно об этом говорит в стандарте.

Date: 2013-02-14 03:36 pm (UTC)
From: [identity profile] jsn.livejournal.com
Беспокоит собственно не это, а неконсистентность. g() [вполне себе const unsigned g(x)], которая не зависит ни от чего, кроме x, тем не менее возвращает разные значения при одном и том же x. Нехорошо это.

Date: 2013-02-14 03:52 pm (UTC)
From: [identity profile] alexott.livejournal.com
а потом ты проводишь часы медитируя над кодом, поскольку не всегда можешь понять откуда ты получил такое число, и почему оно работает на соседней машине...

Date: 2013-02-14 04:02 pm (UTC)
From: [identity profile] ilya-dogolazky.livejournal.com
Есть альтернатива: (а) медитировать часами (б) компилировать КАЖДЫЙ сдвиг в два сравнения с ветвлением плюс одну инструкцию собственно сдвига. Вам какой вариант кажется подходящим?

Date: 2013-02-14 04:54 pm (UTC)
From: [identity profile] juan-gandhi.livejournal.com
Какое ж это достоинство, это дефект.

Date: 2013-02-14 08:48 pm (UTC)
From: [identity profile] jsn.livejournal.com
Для ассемблера, например, это очевидное достоинство.

Date: 2013-02-14 10:53 pm (UTC)
From: [identity profile] kika.livejournal.com
это дефект для тех, кому язык С не нужен. педальный привод велосипеда тоже дефект для автомобиля.

Profile

jsn: (Default)
jsn

July 2020

S M T W T F S
   1234
56789 1011
12131415161718
19202122232425
262728293031 

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Dec. 31st, 2025 07:29 pm
Powered by Dreamwidth Studios