[maemo-developers] signedness of char on ARM vs x86

From: Andrew Daviel advax at triumf.ca
Date: Sun Apr 6 07:40:11 EEST 2008
I have been trying to compile the opencv library for my N810 using
scratchbox. My application is OK on x86 and compiles but doesn't work on 
ARM, and I find
some of the library functions returning different results with supposedly 
identical data. Going back over the library build I find some compiler 
warnings such as
  warning: comparison is always false due to limited range of data type
  warning: converting of negative value `-0x00000000000000001' to `char'

After some time tracing back data include files and defines I find 
that some modules in the library are doing arithmetic with char, and the 
compiler spots e.g. static comparisons.

The following snippet shows the problem:

#include "stdio.h"
int main() {
   int j = -2 ;
   char k ;
   unsigned char m ;
   signed char n ;
   m = j ; n = j ; k = j ;
   if (j < 0) printf ("j < 0\n" ) ;
   if (k < 0) printf ("k < 0\n" ) ;
   if (m < 0) printf ("m < 0\n" ) ;
   if (n < 0) printf ("n < 0\n" ) ;
}

On my i386 desktop, with gcc 4.0.2 or 3.2.3, k < 0
In scratchbox-ARMEL, with gcc 3.4.4, k > 0

By which I presume that "char" is signed on the 386 and unsigned on the 
ARM.

Is there any way I can override the compiler default, or do I have to go 
through everything by hand and see where char is used inappropriately ?

How general is this, that data types are different on different systems
(I know about the int/long issues on 64-bit machines ...) ?


-- 
Andrew Daviel, TRIUMF, Canada
Tel. +1 (604) 222-7376  (Pacific Time)
Network Security Manager

More information about the maemo-developers mailing list