Обсуждение: BUG #4114: Inconsistent shift operator

Поиск
Список
Период
Сортировка

BUG #4114: Inconsistent shift operator

От
"Roman Kononov"
Дата:
The following bug has been logged online:

Bug reference:      4114
Logged by:          Roman Kononov
Email address:      kononov@dls.net
PostgreSQL version: 8.3.1
Operating system:   x86_64 GNU/Linux
Description:        Inconsistent shift operator
Details:

The below test cases show the obvious inconsistency between different
integer types.

test=# \t
Showing only tuples.
test=# select 1::int2 << 17;
         0

test=# select 1::int4 << 33;
         2

test=# select 1::int8 << 65;
         2

test=# select 2::int2 >> 17;
         0

test=# select 2::int4 >> 33;
         1

test=# select 2::int8 >> 65;
         1

Re: BUG #4114: Inconsistent shift operator

От
Zdenek Kotala
Дата:
Roman Kononov napsal(a):
> The following bug has been logged online:
>
> Bug reference:      4114
> Logged by:          Roman Kononov
> Email address:      kononov@dls.net
> PostgreSQL version: 8.3.1
> Operating system:   x86_64 GNU/Linux
> Description:        Inconsistent shift operator
> Details:
>
> The below test cases show the obvious inconsistency between different
> integer types.
>
> test=# \t
> Showing only tuples.
> test=# select 1::int2 << 17;
>          0
>
> test=# select 1::int4 << 33;
>          2
>
> test=# select 1::int8 << 65;
>          2
>
> test=# select 2::int2 >> 17;
>          0
>
> test=# select 2::int4 >> 33;
>          1
>
> test=# select 2::int8 >> 65;
>          1

It seems to be OK regarding how C shift operator works. Try

#include <stdio.h>
#include <inttypes.h>

void fce(int16_t arg1, int32_t arg2)
{
         int16_t res = arg1 << arg2;
         printf("result: %i\n", res);
}

int main()
{
         fce(1,17);
         return 0;
}



        Zdenek

Re: BUG #4114: Inconsistent shift operator

От
Sam Mason
Дата:
On Sun, Apr 20, 2008 at 08:17:50PM +0200, Zdenek Kotala wrote:
> Roman Kononov napsal(a):
> >The below test cases show the obvious inconsistency between different
> >integer types.
>
> It seems to be OK regarding how C shift operator works. Try

Yes, but I interpret this behaviour as not being very useful for people
writing SQL code that uses the shift operators.  C is a very low level
language and you almost always end up writing platform specific code,
SQL is supposed to be much higher level and should abstract away system
specific differences.

I've not been able to think of a nice way of doing this though.


  Sam