<div dir="ltr"><div dir="ltr"><br></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Tue, Jun 23, 2020 at 4:29 AM Henri Menke <<a href="mailto:henrimenke@gmail.com">henrimenke@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><br>
<br>
No, type punning *is* undefined behaviour.<br>
<br>
    6.2.6.1 General<br>
<br>
    7 When a value is stored in a member of an object of union type, the<br>
    bytes of the object representation that do not correspond to that member<br>
    but do correspond to other members take unspecified values.<br>
<br>
<a href="http://port70.net/~nsz/c/c11/n1570.html#6.2.6.1p7" rel="noreferrer" target="_blank">http://port70.net/~nsz/c/c11/n1570.html#6.2.6.1p7</a></blockquote><div><br></div><div>hm, unspecified value, not undefined behaviour.</div><div><br></div><div>Probably this one is ok:</div><div>\directlua{<br>ffi.cdef [[<br> unsigned int c ;<br> union endianess {<br>   uint32_t i;<br>   uint8_t c[sizeof(uint32_t)];<br> }<br>]]<br>local x = ffi.new('union endianess x',{i=0xAABBCCDD})<br>if ffi.sizeof('uint8_t')==1 and ffi.sizeof('uint32_t')==4 then<br> if(x.c[0]==0xDD and x.c[1]==0xCC and x.c[2]==0xBB and x.c[3]==0xAA) then <br>   print "little endian"<br> elseif (x.c[0]==0xAA and x.c[1]==0xBB and x.c[2]==0xCC and x.c[3]==0xDD) then <br>  print "big endian"<br> else <br>  print "mixed endian"<br> end<br>else <br> print "unable to check endianess" <br>end<br>}<br>\end<br></div><div> </div><div>see eg Modern-C on unions</div><div><a href="https://modernc.gforge.inria.fr/#orgd2172c0">https://modernc.gforge.inria.fr/#orgd2172c0</a></div><div><br></div></div><div><br></div>-- <br><div dir="ltr" class="gmail_signature">luigi<br></div></div>