数据在计算机内部以补码的方式存储。
对于int类型为4个字节的系统而言,无符号int类型的取值范围为0~-1(4294967295)
有符号int类型的取值范围为-(2147483648)~-1(2147483647)
1.该程序以有符号int为例,打印最大最小值:
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char* argv[])
{
int i = 0, j = 0;
printf("sizeof(int)=%ld\n",sizeof(int));
puts("initialize i to 2147483647, increment 1 by order");
i = 2147483647;
for(; j <=4; j++)
{
printf("i=%d,0x%x\n",i,i);
i = i + 1;
}
i = 1;
j = 0;
puts("initialize i to 1, decrement 1 by order");
for(; j <=4; j++)
{
printf("i=%d,0x%x\n",i,i);
i = i - 1;
}
return 0;
}
运行结果:
sizeof(int)=4
initialize i to 2147483647, increment 1 by order
i=2147483647,0x7fffffff
i=-2147483648,0x80000000
i=-2147483647,0x80000001
i=-2147483646,0x80000002
i=-2147483645,0x80000003
initialize i to 1, decrement 1 by order
i=1,0x1
i=0,0x0
i=-1,0xffffffff
i=-2,0xfffffffe
i=-3,0xfffffffd
--------------------------------
Process exited after 0.02772 seconds with return value 0
请按任意键继续. . .
当i取值为2147483647时,i+1的值为最小值-2147483648
2. 该程序以无符号int为例,打印最大最小值:
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char* argv[])
{
unsigned int i = 0;
int j = 0;
printf("sizeof(unsigned int)=%ld\n",sizeof(unsigned int));
puts("initialize i to 4294967295, increment 1 by order");
i = 4294967295;
for(; j <=4; j++)
{
printf("i=%u,0x%x\n",i,i);
i = i + 1;
}
i = 1;
j = 0;
puts("initialize i to 1, decrement 1 by order");
for(; j <=4; j++)
{
printf("i=%u,0x%x\n",i,i);
i = i - 1;
}
return 0;
}
运行结果:
sizeof(unsigned int)=4
initialize i to 4294967295, increment 1 by order
i=4294967295,0xffffffff
i=0,0x0
i=1,0x1
i=2,0x2
i=3,0x3
initialize i to 1, decrement 1 by order
i=1,0x1
i=0,0x0
i=4294967295,0xffffffff
i=4294967294,0xfffffffe
i=4294967293,0xfffffffd
--------------------------------
Process exited after 0.009873 seconds with return value 0
请按任意键继续. . .
当i取值为 4294967295时,i+1的取值为0
当i取值为0时,i-1的取值为 4294967295
3.unsigned int 和signed int相互赋值
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char* argv[])
{
signed int number;
unsigned int unumber;
puts("assign 0 to number,unumber");
unumber = number = 0;
printf("number=%d,0x%x;unumber=%u,0x%x\n\n",number,number,unumber,unumber);
puts("assign -1 to number,unumber");
number = -1;
unumber = number;
printf("number=%d,0x%x;unumber=%u,0x%x\n\n",number,number,unumber,unumber);
puts("assign -2147483648 to number,unumber");
unumber = number = -2147483648;
printf("number=%d,0x%x;unumber=%u,0x%x\n\n",number,number,unumber,unumber);
puts("assign 2147483647 to number,unumber");
unumber = number = 2147483647;
printf("number=%d,0x%x;unumber=%u,0x%x\n\n",number,number,unumber,unumber);
puts("assign 4294967295 to number,unumber");
unumber = number = 4294967295;
printf("number=%d,0x%x;unumber=%u,0x%x\n\n",number,number,unumber,unumber);
return 0;
}
运行结果:
assign 0 to number,unumber
number=0,0x0;unumber=0,0x0
assign -1 to number,unumber
number=-1,0xffffffff;unumber=4294967295,0xffffffff
assign -2147483648 to number,unumber
number=-2147483648,0x80000000;unumber=2147483648,0x80000000
assign 2147483647 to number,unumber
number=2147483647,0x7fffffff;unumber=2147483647,0x7fffffff
assign 4294967295 to number,unumber
number=-1,0xffffffff;unumber=4294967295,0xffffffff
--------------------------------
Process exited after 0.01095 seconds with return value 0
请按任意键继续. . .
该程序将一些代表性的数值分别赋给有符号型和无符号型int变量,从打印结果可以看到,对于同一数值,这两种类型的显示结果可能相差很大。