C语言难点三:结合计组的整数加减运算

示例程序

#include
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
#include
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

你可能感兴趣的:(C语言)