Skip to main content

Little Endian and Big Endian

Little and big endian are two ways of storing multibyte data-types ( int, float, etc). In little endian machines, last byte of binary representation of the multibyte data-type is stored first. On the other hand, in big endian machines, first byte of binary representation of the multibyte data-type is stored first.

Suppose integer is stored as 4 bytes (For those who are using DOS based compilers such as C++ 3.0 , integer is 2 bytes) then a variable x with value 0×01234567 will be stored as following.
Memory representation of integer ox01234567 inside Big and little endian machines


How to see memory representation of multibyte data types on your machine?

Here is a sample C code that shows the byte representation of int, float and pointer.
#include <stdio.h>
/* function to show bytes in memory, from location start to start+n*/
void show_mem_rep(char *start, int n)
{
    int i;
    for (i = 0; i < n; i++)
         printf(" %.2x", start[i]);
    printf("\n");
}
/*Main function to call above function for 0x01234567*/
int main()
{
   int i = 0x01234567;
   show_mem_rep((char *)&i, sizeof(i));
   getchar();
   return 0;
}
When above program is run on little endian machine, gives “67 45 23 01″ as output , while if it is run on endian machine, gives “01 23 45 67″ as output.


Is there a quick way to determine endianness of your machine?
There are n no. of ways for determining endianness of your machine. Here is one quick way of doing the same.
#include <stdio.h>
int main()
{
   unsigned int i = 1;
   char *c = (char*)&i;
   if (*c)   
       printf("Little endian");
   else
       printf("Big endian");
   getchar();
   return 0;
}
In the above program, a character pointer c is pointing to an integer i. Since size of character is 1 byte when the character pointer is de-referenced it will contain only first byte of integer. If machine is little endian then *c will be 1 (because last byte is stored first) and if machine is big endian then *c will be 0.


#include <stdint.h>


//! Byte swap unsigned short
uint16_t swap_uint16( uint16_t val ) 
{
    return (val << 8) | (val >> 8 );
}

//! Byte swap short
int16_t swap_int16( int16_t val ) 
{
    return (val << 8) | ((val >> 8) & 0xFF);
}

//! Byte swap unsigned int
uint32_t swap_uint32( uint32_t val )
{
    val = ((val << 8) & 0xFF00FF00 ) | ((val >> 8) & 0xFF00FF ); 
    return (val << 16) | (val >> 16);
}

//! Byte swap int
int32_t swap_int32( int32_t val )
{
    val = ((val << 8) & 0xFF00FF00) | ((val >> 8) & 0xFF00FF ); 
    return (val << 16) | ((val >> 16) & 0xFFFF);
}
int64_t swap_int64( int64_t val )
{
    val = ((val << 8) & 0xFF00FF00FF00FF00ULL ) | ((val >> 8) & 0x00FF00FF00FF00FFULL );
    val = ((val << 16) & 0xFFFF0000FFFF0000ULL ) | ((val >> 16) & 0x0000FFFF0000FFFFULL );
    return (val << 32) | ((val >> 32) & 0xFFFFFFFFULL);
}

uint64_t swap_uint64( uint64_t val )
{
    val = ((val << 8) & 0xFF00FF00FF00FF00ULL ) | ((val >> 8) & 0x00FF00FF00FF00FFULL );
    val = ((val << 16) & 0xFFFF0000FFFF0000ULL ) | ((val >> 16) & 0x0000FFFF0000FFFFULL );
    return (val << 32) | (val >> 32);
}

Comments

Popular posts from this blog

Get current executing method name in Java

//Get method name using Java.lang.Class.getEnclosingMethod()
    public static void getMethodNameUsingClassInstance() {         String methodNameUsingClassInstance =             new Object() {}.getClass().getEnclosingMethod().getName();         System.out.println("Current Method Execution Name Using Class Instance - " +             methodNameUsingClassInstance);     }

//Get method name using StackTraceElement.getMethodName()
    public static void getMethodNameUsingStackTraceElement() {         StackTraceElement stackTraceElements[] = (new Throwable()).getStackTrace();         System.out.println("Current Method Execution Name Using StackTraceElement - " +             stackTraceElements[0].getMethodName());     }

//Get method name using Thread.currentThread().getStackTrace()
    public static void getMethodNameUsingCurrentThread() {         System.out.println("Current Method Execution Name using Current Thread - " +             Thread.currentThread().getStackTrace()[1].ge…

Create Runnable Jar - Eclipse Options

When exporting to a Runnable Jar, there are three options in eclipse Helios. Extract required libraries into JARPackage required libraries into JARCopy required libraries into sub folder next to JAR. What are differences : Extract required libraries into JAR - Extracts the actual .class files from the libraries your app uses and puts those .class files inside the runnable JAR. So, the runnable JAR will not only contain the .class files of your application, but also the .class files of all the libraries your application uses. Package required libraries into JAR - Puts the actual JAR files of the libraries into your runnable JAR. Normally, a JAR file within a JAR file cannot be loaded by the JVM. But Eclipse adds special classes to the runnable JAR to make this possible. Copy required libraries into sub folder next to JAR - Keeps the library JARs completely separate from the runnable JAR, so the runnable JAR will only contain the .class files of your application. Option #2 is convenient be…

Java toString()

toString()
public String toString() { StringBuilder builder = new StringBuilder();
try { Class e = Class.forName(this.getClass().getName()); builder.append(this.getClass().getSimpleName() + " [ ").append( System.getProperty("line.separator"));
while (e.getSuperclass() != null) { Field[] aClassFields = e.getDeclaredFields(); Field[] arg3 = aClassFields; int arg4 = aClassFields.length;
for (int arg5 = 0; arg5 < arg4; ++arg5) { Field field = arg3[arg5]; field.setAccessible(true); builder.append("\t") .append(field.getName()) .append(" = ") .append(field.getName() .matches("(?i:.*password.*)") ? "<password_field>" : field.get(this)).append(",") .append(System.getProperty("line.separator")); }
e = e.getSuperclass(); }
builder.append("]"); } catch (Exception arg7) { arg7.printStackTrace(); }
return builder.toString(); }