Несколько слов о языке C
Feb. 14th, 2013 05:58 pm[несколько слов пропущено, потому что они все нецензурные]
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 04:19 pm (UTC)marck@castor:~/tmp/jsn-shift> clang -O2 -o r r.c && ./r x == 0, g(x) == 4196043 x == 0, g(x) == 1 marck@castor:~/tmp/jsn-shift> clang --version FreeBSD clang version 3.1 (branches/release_31 156863) 20120523 Target: x86_64-unknown-freebsd9.0 Thread model: posix marck@castor:~/tmp/jsn-shift> uname -a FreeBSD castor.rinet.ru 9.1-STABLE FreeBSD 9.1-STABLE #0 r245742: Mon Jan 21 21:29:07 MSK 2013 marck@castor.rinet.ru:/usr/obj/usr/src/sys/CASTOR amd64