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