Dmitry Morozovsky <[EMAIL PROTECTED]> wrote:
>
> On Sat, 12 Aug 2006, Andrey V. Elsukov wrote:
>
> AVE> >On Sat, Aug 12, 2006 at 05:51:01PM +0400, Andrey V. Elsukov wrote:
> AVE> >> for(i = 0; i < sizeof(buf); i++)
> AVE> >> buf[i] = (char)toupper(buf[i]);
> AVE> >
> AVE> > buf[i] = (char)toupper((unsigned char)buf[i]);
> AVE> >Standard integer promotion promotes KOI8-R char codes like 0xd4 into
> 0xffffffd4.
> AVE> >Since such codepoints are not defined for KOI8-R, toupper returns them
> AVE> >unchaged, as specified in documentation.
> AVE>
> AVE> Thanks, this works! But why this example works on Linux without type
> conversions?
>
> Linux has unsigned chars by default, while FreeBSD (and other current *BSDs)
> signed.
>
> Even large projects like PostgreSQL stepped into this trap at least once ;-)
>
> Sincerely,
> D.Marck [DM5020, MCK-RIPE, DM3-RIPN]
"Linux" does not have unsigned char by default.
This is a log from an x86 LINUX machine:
[linux]$ cat c.c
main()
{
char c;
unsigned char uc;
c = -1;
uc = -1;
printf("c is %d\n", c);
printf("uc is %d\n", uc);
}
[linux]$ uname
Linux
[linux]$ ./a.out
c is -1
uc is 255
The signedness of char is usually a hardware-related issue. If the
hardware provides a single instruction to load-and-sign-extend a
character, then char will typically be signed; if the hardware's
instruction to load a char (or a byte) does not sign-extend, then
the char will be unsigned.
For example, Linux on an IBM mainframe uses unsigned as the default
for 'char', while x86 Linux uses signed.
So, it could easily be that your particular Linux (on a particular
hardware implementation) uses unsigned as the default signedness for
char.
- Dave Rivers -
--
[EMAIL PROTECTED] Work: (919) 676-0847
Get your mainframe programming tools at http://www.dignus.com
_______________________________________________
[email protected] mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-stable
To unsubscribe, send any mail to "[EMAIL PROTECTED]"