示例程序
#include<stdio.h>
int main(){
unsigned char a=0;
int b=1;
do{
b++;
a--;
}while(a!=0);
printf("%d\n",b);
return 0;
该程序运行结果为257
结合计组中的减法相当于加上补码就可以很好的理解,为了直观表示,利用c++中的bitset函数输出a的二进制以及a的十进制
#include<stdio.h>
#include<bits/stdc++.h>
using namespace std;
int main(){
unsigned char a=0;
int b=1;
do{
b++;
a--;
bitset<8> mb(a);
string ms=mb.to_string();
cout<<ms<<" "<<(int)a<<endl;
}while(a!=0);
printf("%d\n",b);
return 0;
}
运行结果
11111111 255
11111110 254
11111101 253
11111100 252
11111011 251
11111010 250
11111001 249
11111000 248
11110111 247
11110110 246
11110101 245
11110100 244
11110011 243
11110010 242
11110001 241
11110000 240
11101111 239
11101110 238
11101101 237
11101100 236
11101011 235
11101010 234
11101001 233
11101000 232
11100111 231
11100110 230
11100101 229
11100100 228
11100011 227
11100010 226
11100001 225
11100000 224
11011111 223
11011110 222
11011101 221
11011100 220
11011011 219
11011010 218
11011001 217
11011000 216
11010111 215
11010110 214
11010101 213
11010100 212
11010011 211
11010010 210
11010001 209
11010000 208
11001111 207
11001110 206
11001101 205
11001100 204
11001011 203
11001010 202
11001001 201
11001000 200
11000111 199
11000110 198
11000101 197
11000100 196
11000011 195
11000010 194
11000001 193
11000000 192
10111111 191
10111110 190
10111101 189
10111100 188
10111011 187
10111010 186
10111001 185
10111000 184
10110111 183
10110110 182
10110101 181
10110100 180
10110011 179
10110010 178
10110001 177
10110000 176
10101111 175
10101110 174
10101101 173
10101100 172
10101011 171
10101010 170
10101001 169
10101000 168
10100111 167
10100110 166
10100101 165
10100100 164
10100011 163
10100010 162
10100001 161
10100000 160
10011111 159
10011110 158
10011101 157
10011100 156
10011011 155
10011010 154
10011001 153
10011000 152
10010111 151
10010110 150
10010101 149
10010100 148
10010011 147
10010010 146
10010001 145
10010000 144
10001111 143
10001110 142
10001101 141
10001100 140
10001011 139
10001010 138
10001001 137
10001000 136
10000111 135
10000110 134
10000101 133
10000100 132
10000011 131
10000010 130
10000001 129
10000000 128
01111111 127
01111110 126
01111101 125
01111100 124
01111011 123
01111010 122
01111001 121
01111000 120
01110111 119
01110110 118
01110101 117
01110100 116
01110011 115
01110010 114
01110001 113
01110000 112
01101111 111
01101110 110
01101101 109
01101100 108
01101011 107
01101010 106
01101001 105
01101000 104
01100111 103
01100110 102
01100101 101
01100100 100
01100011 99
01100010 98
01100001 97
01100000 96
01011111 95
01011110 94
01011101 93
01011100 92
01011011 91
01011010 90
01011001 89
01011000 88
01010111 87
01010110 86
01010101 85
01010100 84
01010011 83
01010010 82
01010001 81
01010000 80
01001111 79
01001110 78
01001101 77
01001100 76
01001011 75
01001010 74
01001001 73
01001000 72
01000111 71
01000110 70
01000101 69
01000100 68
01000011 67
01000010 66
01000001 65
01000000 64
00111111 63
00111110 62
00111101 61
00111100 60
00111011 59
00111010 58
00111001 57
00111000 56
00110111 55
00110110 54
00110101 53
00110100 52
00110011 51
00110010 50
00110001 49
00110000 48
00101111 47
00101110 46
00101101 45
00101100 44
00101011 43
00101010 42
00101001 41
00101000 40
00100111 39
00100110 38
00100101 37
00100100 36
00100011 35
00100010 34
00100001 33
00100000 32
00011111 31
00011110 30
00011101 29
00011100 28
00011011 27
00011010 26
00011001 25
00011000 24
00010111 23
00010110 22
00010101 21
00010100 20
00010011 19
00010010 18
00010001 17
00010000 16
00001111 15
00001110 14
00001101 13
00001100 12
00001011 11
00001010 10
00001001 9
00001000 8
00000111 7
00000110 6
00000101 5
00000100 4
00000011 3
00000010 2
00000001 1
00000000 0
257
分析:由于char为1个字节,占8位,因此unsigned char a=0;在计算机中存储的是00000000(原码==补码),执行a-1相当于a的反码加上-1的反码,-1的反码为11111111,即00000000+11111111=11111111,故执行后的存储在计算机中的内容为11111111,由于a为char类型的变量,转化成int输出是将计算机中的内容按无符号解析(这是一种自动转化,其中ASCII码的范围为0-255,故按无符号解析),再执行a-1时相当于11111111+1111111=11111110,按无符号解析后的值为254,do……while是先执行再判断条件,也就是从最开始a-1一直到a为0退出循环的时候一共执行了256次,b相当于1+256=257