
Efficient unsigned-to-signed cast avoiding implementation-defined behavior - luu
http://stackoverflow.com/q/13150449/334816
======
Someone
My money is on using memcpy. Any decent compiler knows to optimise it away:

    
    
      #include <stdio.h>
      #include <memory.h>
      #include <limits.h>
    
      static inline int unsigned_to_signed(unsigned n)
      {
          int result;
          memcpy( &result, &n, sizeof(result));
          return result;
      }
    
      int main(int argc, const char * argv[])
      {
          unsigned int x = UINT_MAX - 1;
          int xx = unsigned_to_signed(x);
          return xx;
      }
    

For me (Xcode 8.3.2, Apple LLVM 8.1, -O3), that produces:

    
    
      _main:                                  ## @main
      Lfunc_begin0:
      	.loc	1 21 0                  ## /Users/Someone/main.c:21:0
      	.cfi_startproc
      ## BB#0:
      	pushq	%rbp
      Ltmp0:
      	.cfi_def_cfa_offset 16
      Ltmp1:
      	.cfi_offset %rbp, -16
      	movq	%rsp, %rbp
      Ltmp2:
      	.cfi_def_cfa_register %rbp
      	##DEBUG_VALUE: main:argc <- %EDI
      	##DEBUG_VALUE: main:argv <- %RSI
      Ltmp3:
      	##DEBUG_VALUE: main:x <- 2147483646
      	##DEBUG_VALUE: main:xx <- 2147483646
      	.loc	1 24 5 prologue_end     ## /Users/Someone/main.c:24:5
      	movl	$-2, %eax
      	popq	%rbp
      	retq
      Ltmp4:
      Lfunc_end0:
      	.cfi_endproc

