| View previous topic :: View next topic | 
	
	
		| Author | Message | 
	
		| Marco27293 
 
 
 Joined: 09 May 2020
 Posts: 136
 
 
 
			    
 
 | 
			
				| PIC18F47J53 CCS C Compiler 5.090 bit shift |  
				|  Posted: Tue Jul 21, 2020 9:24 am |   |  
				| 
 |  
				| Hi, 
 Is there any diference between:
 
 
  	  | Code: |  	  | for(k=0;k<(Hex_File_Info[Trunks_number]<<1);k+=2) {
 err+=M24M02_random_read_2byte_Loader(1,0x208+(k<<1),&trunc_address[k]);
 err+=M24M02_random_read_2byte_Loader(1,0x20A+(k<<1),&trunc_address[k+1]);
 }
 
 //and
 
 for(k=0;k<(Hex_File_Info[Trunks_number]*2);k+=2)
 {
 err+=M24M02_random_read_2byte_Loader(1,0x208+(k*2),&trunc_address[k]);
 err+=M24M02_random_read_2byte_Loader(1,0x20A+(k*2),&trunc_address[k+1]);
 }
 | 
 
 k RAM variable value behaviour is the same or not?
 |  | 
	
		|  | 
	
		| temtronic 
 
 
 Joined: 01 Jul 2010
 Posts: 9587
 Location: Greensville,Ontario
 
 
			    
 
 | 
			
				|  |  
				|  Posted: Tue Jul 21, 2020 10:40 am |   |  
				| 
 |  
				| The easiest way to see is cut a small program with both versions, compile it, then dump the listing and look at the code that was generated. 
 The compiler is smart and probably knows <<1 is same as *2 BUT you really should look and see
 
 Jay
 |  | 
	
		|  | 
	
		| Ttelmah 
 
 
 Joined: 11 Mar 2010
 Posts: 19964
 
 
 
			    
 
 | 
			
				|  |  
				|  Posted: Tue Jul 21, 2020 11:49 am |   |  
				| 
 |  
				| It depends on the size and type of 'k'. Bit rotation is only guaranteed to be a *2, on an positive value, with
 less than one minus the number of bits held by the number of bits
 storable by the value.
 
 So if you have a signed int16, if the rotation goes out of the fifteenth bit,
 the equivalence is not guaranteed. Similarly rotation of a -ve number
 does not have this guaranteed equivalence.
 |  | 
	
		|  | 
	
		| jeremiah 
 
 
 Joined: 20 Jul 2010
 Posts: 1401
 
 
 
			    
 
 | 
			
				|  |  
				|  Posted: Tue Jul 21, 2020 1:50 pm |   |  
				| 
 |  
				| Also keep in mind that per the C standard, left shifts of signed integers are potentially undefined (Section 6.5.7/4 of the standard), so make sure any data that you left shift is not signed. |  | 
	
		|  | 
	
		|  |