[M3devel] 32bit negative base 16 constants?

Tony Hosking hosking at cs.purdue.edu
Thu Apr 11 08:03:02 CEST 2013


Actually, writing that you get what you expressed:

If an explicit base is present, the value of the literal must be less than 2^Word.Size, and its interpretation uses the convention of the Word interface.

Word.T is unsigned, so you only get the 32 bits you asked for.

If you want a signed value then you need to express the sign explicitly starting from a constant, just as you have done with:

> CONST UID_WORD = (* 16_97E237E2 *) -1881139893;


On Apr 11, 2013, at 3:14 PM, Jay K <jay.krell at cornell.edu> wrote:

>   
>   I have some 32bit constants.   
>   
> e.g.:  
>   
>  CONST UID_WORD = 16_97E237E2;  
>   
>  but this isn't right. 
>  On a 64bit system, that is a 64bit integer 
>  with a "large" positive value, instead of 
>  the intended 32bit negative value. 
>   
>  Is there an ideal (i.e. CONST) way to do this? 
>  Portably to 64bit systems? 
>   
>  I have found two unsatisfactory choices: 
>   
>  1) use decimal: 
>    
>  #include <stdio.h> 
>  int main() 
>  { 
>  printf("%X %d\n", 0x97E237E2); 
>  return 0; 
>  } 
>  
>  
>  cc 1.c 
>  ./a.out 
> 97E237E2 -1881139893
> 
> CONST UID_WORD = (* 16_97E237E2 *) -1881139893;
>  
>  
>  2) change it to VAR and a runtime conversion:
>  
>  
>  PROCEDURE SignExtend(a, b: INTEGER): INTEGER =
>  BEGIN
>     b := Word.LeftShift(-1, b - 1); 
>     IF Word.And(a, b) # 0 THEN 
>         a := Word.Or(a, b); 
>     END; 
>     RETURN a; 
>  END SignExtend; 
> 
>  PROCEDURE SignExtend32(a: INTEGER): INT32 = 
>  BEGIN 
>      RETURN SignExtend(a, 32); 
>  END SignExtend32; 
> 
>  CONST IntegerToTypeid = SignExtend32; 
> 
> 
>  VAR UID_WORD := IntegerToTypeid(16_97E237E2); (* CARDINAL *) 
> 
> This gives a warning:
> 
> CONST UID_INTEGER : INT32 = 16_195C2A74; (* INTEGER *)
> 
> and then at runtime gives an error assigning it to an INT32.
> 
> 
>  any other ways? 
> 
> 
> Thanks,
>  - Jay
> 
> 



Antony Hosking | Associate Professor | Computer Science | Purdue University
305 N. University Street | West Lafayette | IN 47907 | USA
Mobile +1 765 427 5484





-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://m3lists.elegosoft.com/pipermail/m3devel/attachments/20130411/4802481d/attachment-0002.html>


More information about the M3devel mailing list