整型数据:
整型家族
char
unsigned char
signed char
short
unsigned short
signed short
int
unsigned int
signed int
long
unsigned long
signed long
原码、反码、补码
1、正整数原码、反码、补码相同,直接进行二进制转换就可;(2^32-1个正整数)
2、负整数32位的首位为符号位(1代表负数);(2^31-1个符数)
原码将剩余的31位通过负整数的绝对值进行二进制转化
反码是符号位不变,其余位数取反
补码是反码+1
3、0是一个特殊的数,由于符号位存在,分为+0,-0;
+0 为00000000000000000000000000000000
-0 为10000000000000000000000000000000
减法计算
我们知道计算机的CPU是不能处理减法的,于是对10-20,计算机处理成10+(-20)
int main(){
int a = 10; //00000000000000000000000000001010 (1)原反补相同
int b = -20;//10000000000000000000000000010100 原码
//11111111111111111111111111101011 反码
//11111111111111111111111111101100 补码(2)
//11111111111111111111111111110110 (1)+(2) 补码
//11111111111111111111111111110101 反码
//10000000000000000000000000001010 原码 -->-10
return 0;
}
计算机的大小端
何为大小端?
如何判断计算机是大端还是小端?
int check_sys(){
int a = 1;//0x00 00 00 01
char *p = (char *)&a;//char *类型只能存储1个字节
return *p;//若是小端则存储01(低地址存储低字节) 大端则存储00 (低地址存储高字节)
}
int main(){
if(check_sys()==1){
printf("小端\n");
}else
{
printf("大端\n");
}
return 0;
}
一些操作实例
1、
//输出什么?
#include <stdio.h>
int main(){
char a = -1;//10000000000000000000000000000001 原码
//11111111111111111111111111111110 反码
//11111111111111111111111111111111 补码
//实际只能保存11111111
//11111111111111111111111111111111 整型提升 补码
//11111111111111111111111111111110 反码
//10000000000000000000000000000001 原码
signed char b = -1;//和上个例子一样
unsigned char c = -1;//注意到无符号 则整型提升时00000000000000000000000011111111 补码=反码=原码
printf("%d %d %d", a, b, c);
}
2、
int main(){
char a = 128;
printf("%u", a);
//10000000000000000000000010000000-- 128
//10000000 a
//11111111111111111111111110000000 --整型提升
//由于无符号 直接转化成为十进制 4294967168
return 0;
}
int main()
{
char a = -128;//与上一个主函数其实没有区别
printf("%u\n",a);
return 0; }
3、
int main(){
int i = -20;
//10000000000000000000000000010100原码
//11111111111111111111111111101011反码
//11111111111111111111111111101100补码
unsigned int j = 10;
//00000000000000000000000000001010原码
//11111111111111111111111111110110和 补码
//11111111111111111111111111110101反码
//10000000000000000000000000001010原码
printf("%d\n", i + j);
}
4、
int main(){
unsigned int i;
for (i = 9; i >= 0;i--){
printf("%u\n", i);
Sleep(1000);
}
//10000000000000000000000000000001(-1)
//11111111111111111111111111111110
//11111111111111111111111111111111
//11111111 &i
//11111111111111111111111111111111(极大数)由于无符号整型所以死循环
return 0;
}
5、
int main(){
char a[1000];//char 类型储存数据只能从-128->127
int i;
for (i = 0; i < 1000;i++){
a[i] = -1 - i;
}
printf("%d", strlen(a));//答案255
return 0;
//-1--> 整型提升-->-1
//-2--> 整型提升-->-2
//......
//-127-->整型提升-->-127
//-128-->整型提升-->-128
//-129-->整型提升-->127
//-130-->整型提升-->126
//......
//-255-->整型提升-->1
//-256-->整形日升-->0-->strlen结束标志
}