| 
					
							
        
    
        
						
			 | 
			
			
					    
					
        
         
          
         
	
            | signed unsigned Fra : Troels | 
  Dato :  23-11-10 02:01 |  
  |   
            Hej,
 
 Nu blev jeg igen snydt af min compiler
 
     signed int s16Value = -1;
     unsigned int u16Value = 16;
 
     signed int result1 = s16Value - u16Value;
 
 Værdien giver -17 som forventet
 
 Men:
     #define MIN(x,y) ((x) < (y)) ? (x) : (y)
     signed int result2 = MIN((s16Value - u16Value) , 0);
 giver 0 !
 
 Hvis man skriver den ud bliver det til:
    if ((s16Value - u16Value) < 0)
    {
             ......
 hvilket aldrig bliver sandt , fordi regnestykket bliver lavet
 'unsigned'
 
 Er det hamret ud i granit at c altid vil gøre sådan, eller er det
 implementationsspecifikt ?
 Har prøvet på IAR og MSVC++2010
 
 
 /Troels
 
 
  
            
             |   |   
            
        
 
            
         
           Arne Vajhøj (24-11-2010) 
         
	
            | Kommentar Fra : Arne Vajhøj | 
  Dato :  24-11-10 02:49 |  
  |   
            On 23-11-2010 04:01, Troels wrote:
 > Hej,
 >
 > Nu blev jeg igen snydt af min compiler
 >
 >      signed int s16Value = -1;
 >      unsigned int u16Value = 16;
 >
 >      signed int result1 = s16Value - u16Value;
 >
 > Værdien giver -17 som forventet
 >
 > Men:
 >      #define MIN(x,y) ((x)<  (y)) ? (x) : (y)
 >      signed int result2 = MIN((s16Value - u16Value) , 0);
 > giver 0 !
 >
 > Hvis man skriver den ud bliver det til:
 >    if ((s16Value - u16Value)<  0)
 >    {
 >              ......
 > hvilket aldrig bliver sandt , fordi regnestykket bliver lavet
 > 'unsigned'
 >
 > Er det hamret ud i granit at c altid vil gøre sådan, eller er det
 > implementationsspecifikt ?
 > Har prøvet på IAR og MSVC++2010
 
 C99 siger:
 
 Otherwise, if the operand that has unsigned integer type has rank greater or
 equal to the rank of the type of the other operand, then the operand with
 signed integer type is converted to the type of the operand with unsigned
 integer type.
 
 Og hvis jeg læser den rigtigt så garanterer den det du
 observerer.
 
 C89 er mere direkte:
 
 Otherwise, if either operand has type unsigned int, the other
 operand is converted to unsigned int.
 
 Arne
  
            
             |   |   
            
        
 
            
         
           Troels (29-11-2010) 
         
	
            | Kommentar Fra : Troels | 
  Dato :  29-11-10 07:04 |  
  |   
            >
 > Og hvis jeg læser den rigtigt så garanterer den det du
 > observerer.
 >
 
 Takker,
 + - * / er lækkert syntax sukker, men djævlen ligger, som altid, i
 detaljen !
 (man skal tænke lidt over promotion også, osv)
 
 /T
  
            
             |   |   
            
        
 
    
 
					
					 
			 | 
			
				
        
			 |