Complicated Declarations - Programming

Q1:

What will be the output of the program?
#include<stdio.h>
typedef unsigned long int uli;
typedef uli u;

int main()
{
    uli a;
    u b = -1;
    a = -1;
    printf('%lu, %lu', a, b);
    return 0;
}

A 4343445454, 4343445454

B 4545455434, 4545455434

C 4294967295, 4294967295

D Garbage values

ANS:A - 4343445454, 4343445454

The system will treat the negative numbers with 2's complement method. For 'long int' system will occupy 4 bytes (32 bits). Therefore, Binary 1 : 00000000 00000000 00000000 00000001 To represent -1, system uses the 2's complement value of 1. Add 1 to the 1's complement result to obtain 2's complement of 1. So, First take 1's complement of binary 1 (change all 0s to 1s and all 1s to 0s) 1's complement of Binary 1: 11111111 11111111 11111111 11111110 2's complement of Binary 1: (Add 1 with the above result) 11111111 11111111 11111111 11111111 In HexaDecimal 11111111 11111111 11111111 11111111 = FFFF FFFF FFFF FFFF In Unsigned Integer 11111111 11111111 11111111 11111111 = 4294967295.