例一:
#include<stdio.h>
int main()
{
/* *///
char a = -1;
signed char b = -1;
unsigned char c = -1;
printf("a=%d,c%d,c=%d", a, b, c);
return 0;
}输出为:
a=-1,c=-1,c=255
在32位操作系统中:
-1的源码:1000000000000000000000000001
反码:11111111111111111111111111111110( 符号位不变,其他取反)
补码:11111111111111111111111111111111(反码+1)
char 类型的a,b,c只占八个字节,会发生截断,所以只放8个字节的字符
char a->11111111 (char-->signed char)
signed char b->11111111
unsigned char c->11111111
当把a,b,c要变成整型变量被打印出来时,会发生整型提升
a:(有符号类型前方补符号位)11111111111111111111111111111111(补码)
1000000000000000000000000001(-1源码)
b:(有符号类型前方补符号位)11111111111111111111111111111111(补码)
1000000000000000000000000001(-1源码)
c:(无符号类型高位补0):00000000000000000000000011111111
(正数源码反码补码一样,以源码读出255)
例二:
#include<stdio.h>
int main()
{
char a = -128;
printf("%u", a);
return 0;
}输出:4294967168
-128源码:10000000000000000000000000001000000
反码:1111111111111111111111111111111101111111
补码:111111111111111111111111111111111000000
截断:1000000 (十进制为128)
整型提升:1111111111111111111111111000000 (十进制4294967168)
(有符号高位补符号位,但用无符号输出,于是提升后第一位就不看成符号位)
例三:
#include<stdio.h>
int main()
{
int i = -20;
unsigned int j = 10;
printf("%d\n", i + j);
return 0;
}输出:-10
-20源码:10000000000000000000000000010100
-20烦码:111111111111111111111111111111101011
-20补码:111111111111111111111111111111101101
10补码:00000000000000000000000000001010
-20+10补码相加:111111111111111111111111111111110110
源码:10000000000000000000000000001010(十进制-10)
例四:
#include<stdio.h>
#include<windows.h>
int main()
{
unsigned int i;
for(i = 9; i >= 0; i--)
{
printf("%u\n", i );
Sleep(1000);
}
return 0;
}输出:
9
8
7
6
5
4
3
2
1
0
4294967295
4294967294
4294967293
4294967292
4294967291
4294967290
4294967289
4294967288
4294967287......
当循环运行到i=0时;i--,-1后被放入一个无符号整型中,符号位被忽略读出的十进制数为4294967295,大于0进入新的循环,以此类推,i永远大于0,循环无法停止
-1的补码为11111111111111111111111111111111
例五:
#include<stdio.h>
int main()
{
char a[1000];
int i;
for (i = 0; i <= 1000; i++)
{
a[i] = -1 - i;
}
printf("%d\n", strlen(a));
return 0;
}输出:255

strlen识别到\0停止,也就时0,从-1开始到-128,127到0之间有128+127个字符
所以答案为255。