setlocale howto

Thomas David Rivers rivers at dignus.com
Sat Aug 12 18:47:14 UTC 2006


Dmitry Morozovsky <marck at 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 at dignus.com                        Work: (919) 676-0847
Get your mainframe programming tools at http://www.dignus.com


More information about the freebsd-stable mailing list