Date: Sat, 12 Aug 2006 14:49:11 -0400 (EDT) From: Thomas David Rivers <rivers@dignus.com> To: bu7cher@yandex.ru, marck@rinet.ru Cc: kostikbel@gmail.com, maxim@freebsd.org, freebsd-stable@freebsd.org Subject: Re: setlocale howto Message-ID: <200608121849.k7CInB612383@lakes.dignus.com> In-Reply-To: <20060812212327.Q25511@woozle.rinet.ru>
next in thread | previous in thread | raw e-mail | index | archive | help
Dmitry Morozovsky <marck@rinet.ru> 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 - -- rivers@dignus.com Work: (919) 676-0847 Get your mainframe programming tools at http://www.dignus.com
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200608121849.k7CInB612383>