1 数据类型
java中:
byte 8位 1字节
short/char 16位 2字节
int 32位 4字节
long 64位 8字节
float 32位 4字节
double 64位 8字节
c在x8632位中
printf("%d\n",sizeof(char)); //1字节
printf("%d\n",sizeof(short)); //2
printf("%d\n",sizeof(int)); //4
printf("%d\n",sizeof(long)); //4
printf("%d\n",sizeof(float)); //4
printf("%d\n",sizeof(double)); //8
其指针大小均为4字节,寻址32位。
2 原补码
作用:一是减法变加法,二是正0与负0一致
结果:计算机中数值以补码形式表示
具体:-128=[1000 0000]补,32位系统中表示值为[-128, 127],0其补码仅为[0000 0000]
练习:
1)
int main()
{
char a=64;
a <<=1;
printf(“%d ”,a);
a>>=1;
printf(“%d ”,a);
return 0;
}
结果:-128 -64
说明:
有符号数据类型的移位操作:
对于char、short、int、long这些有符号的数据类型:
负数 左移:符号位始终为1,其他位左移
正数 左移:所有位左移,即 <<,可能会变成负数
负数 右移:取绝对值,然后右移,再取相反数 (对于x86平台的gcc编译器,最高位移入1,也就是仍保持负数的符号位,这种处理方式对负数仍然保持了“右移1位相当于除以2”的性质。)
正数 右移:所有位右移,即 >> ,高位补0
一个程序如果使用了有符号数的右移位操作,它就是不可移植的
因为在C语言标准中,只规定了无符号数的移位操作是采用逻辑移位(即左移、右移都是使用的逻辑左移和逻辑右移)。
而对于有符号数,其左移操作还是逻辑左移,但右移操作是采用逻辑右移还是算术右移就取决于机器了!(算术右移和逻辑右移的区别是:算术右移不右移符号位,即最高位,右移后前补0还是1取决于符号位的值;逻辑右移执行时将移动符号位,右移后前补0)。
2)
#include<iostream.h>
void main()
{
short int n=-1;
cout<<(unsigned short int)n<<endl;
}
结果:32位操作系统下为:65535
无符号即将符号位算为数值位考虑。
3)
unsigned char a=0xA5;
unsigned char b=~a<<4;
unsigned char c=~a>>4;
printf("b=%d\n",b); //b=160
printf("c=%d\n",c); //c=245
int i=4;
printf("i=4 left shift%d\n",~i<<2); //i=4 left shift -20
printf("i=4 right shift%d\n",~i>>2); //i=4 right shift -2
int j=-6;
printf("j=-6 left shift%d\n",~j<<2); //j=-6 left shift 20
printf("j=-6 right shift%d\n",~j>>2); //j=-6 right shift 1
3 进制转换
10进制转为R进制
整数部分通过连续/R,取在[0, R-1]间的余倒着连起。
小数部分通过连续*R,取结果中的整数顺着连起。
将两部分相加,即可。