// gcc -Wall -Wextra -Werror -pedantic -std=c99 twos-complement-01.c
#include <stdio.h>
struct bits {
unsigned char b0:1;
unsigned char b1:1;
unsigned char b2:1;
unsigned char b3:1;
unsigned char b4:1;
unsigned char b5:1;
unsigned char b6:1;
unsigned char b7:1;
};
union byte {
char c;
struct bits b;
};
void showbin(union byte ch, char *s)
{
snprintf(s, 9, "%d%d%d%d%d%d%d%d",
ch.b.b7, ch.b.b6, ch.b.b5, ch.b.b4,
ch.b.b3, ch.b.b2, ch.b.b1, ch.b.b0);
}
int main(void)
{
char p[9], n[9];
union byte ch;
for(int i = 0; i < 128; i++) {
ch.c = i;
showbin(ch, p);
ch.c = -1 * i;
showbin(ch, n);
printf("%3d: %s , %4d: %s\n", i, p, -1*i ,n);
}
return 0;
}
0: 00000000 , 0: 00000000
1: 00000001 , -1: 11111111
2: 00000010 , -2: 11111110
3: 00000011 , -3: 11111101
4: 00000100 , -4: 11111100
5: 00000101 , -5: 11111011
6: 00000110 , -6: 11111010
7: 00000111 , -7: 11111001
8: 00001000 , -8: 11111000
9: 00001001 , -9: 11110111
10: 00001010 , -10: 11110110
11: 00001011 , -11: 11110101
12: 00001100 , -12: 11110100
13: 00001101 , -13: 11110011
14: 00001110 , -14: 11110010
15: 00001111 , -15: 11110001
16: 00010000 , -16: 11110000
17: 00010001 , -17: 11101111
18: 00010010 , -18: 11101110
19: 00010011 , -19: 11101101
20: 00010100 , -20: 11101100
21: 00010101 , -21: 11101011
22: 00010110 , -22: 11101010
23: 00010111 , -23: 11101001
24: 00011000 , -24: 11101000
25: 00011001 , -25: 11100111
26: 00011010 , -26: 11100110
27: 00011011 , -27: 11100101
28: 00011100 , -28: 11100100
29: 00011101 , -29: 11100011
30: 00011110 , -30: 11100010
31: 00011111 , -31: 11100001
32: 00100000 , -32: 11100000
33: 00100001 , -33: 11011111
34: 00100010 , -34: 11011110
35: 00100011 , -35: 11011101
36: 00100100 , -36: 11011100
37: 00100101 , -37: 11011011
38: 00100110 , -38: 11011010
39: 00100111 , -39: 11011001
40: 00101000 , -40: 11011000
41: 00101001 , -41: 11010111
42: 00101010 , -42: 11010110
43: 00101011 , -43: 11010101
44: 00101100 , -44: 11010100
45: 00101101 , -45: 11010011
46: 00101110 , -46: 11010010
47: 00101111 , -47: 11010001
48: 00110000 , -48: 11010000
49: 00110001 , -49: 11001111
50: 00110010 , -50: 11001110
51: 00110011 , -51: 11001101
52: 00110100 , -52: 11001100
53: 00110101 , -53: 11001011
54: 00110110 , -54: 11001010
55: 00110111 , -55: 11001001
56: 00111000 , -56: 11001000
57: 00111001 , -57: 11000111
58: 00111010 , -58: 11000110
59: 00111011 , -59: 11000101
60: 00111100 , -60: 11000100
61: 00111101 , -61: 11000011
62: 00111110 , -62: 11000010
63: 00111111 , -63: 11000001
64: 01000000 , -64: 11000000
65: 01000001 , -65: 10111111
66: 01000010 , -66: 10111110
67: 01000011 , -67: 10111101
68: 01000100 , -68: 10111100
69: 01000101 , -69: 10111011
70: 01000110 , -70: 10111010
71: 01000111 , -71: 10111001
72: 01001000 , -72: 10111000
73: 01001001 , -73: 10110111
74: 01001010 , -74: 10110110
75: 01001011 , -75: 10110101
76: 01001100 , -76: 10110100
77: 01001101 , -77: 10110011
78: 01001110 , -78: 10110010
79: 01001111 , -79: 10110001
80: 01010000 , -80: 10110000
81: 01010001 , -81: 10101111
82: 01010010 , -82: 10101110
83: 01010011 , -83: 10101101
84: 01010100 , -84: 10101100
85: 01010101 , -85: 10101011
86: 01010110 , -86: 10101010
87: 01010111 , -87: 10101001
88: 01011000 , -88: 10101000
89: 01011001 , -89: 10100111
90: 01011010 , -90: 10100110
91: 01011011 , -91: 10100101
92: 01011100 , -92: 10100100
93: 01011101 , -93: 10100011
94: 01011110 , -94: 10100010
95: 01011111 , -95: 10100001
96: 01100000 , -96: 10100000
97: 01100001 , -97: 10011111
98: 01100010 , -98: 10011110
99: 01100011 , -99: 10011101
100: 01100100 , -100: 10011100
101: 01100101 , -101: 10011011
102: 01100110 , -102: 10011010
103: 01100111 , -103: 10011001
104: 01101000 , -104: 10011000
105: 01101001 , -105: 10010111
106: 01101010 , -106: 10010110
107: 01101011 , -107: 10010101
108: 01101100 , -108: 10010100
109: 01101101 , -109: 10010011
110: 01101110 , -110: 10010010
111: 01101111 , -111: 10010001
112: 01110000 , -112: 10010000
113: 01110001 , -113: 10001111
114: 01110010 , -114: 10001110
115: 01110011 , -115: 10001101
116: 01110100 , -116: 10001100
117: 01110101 , -117: 10001011
118: 01110110 , -118: 10001010
119: 01110111 , -119: 10001001
120: 01111000 , -120: 10001000
121: 01111001 , -121: 10000111
122: 01111010 , -122: 10000110
123: 01111011 , -123: 10000101
124: 01111100 , -124: 10000100
125: 01111101 , -125: 10000011
126: 01111110 , -126: 10000010
127: 01111111 , -127: 10000001