1.无符号基本型 unsigned int
和有符号型整数相比,在计算机内存中表示不区分,但是运算时有区别。特别注意它被赋值为负数的时候,最高位不是符号位,而是数据位。
例子如下:
int n = -2;
printf("%d\n",n);
printf("%u\n",n);
结果为:
-2
4294967294
2.字节数
在vc中
int 4个字节
long 4个字节
long long 8个字节
short 2个字节
char 1个字节
float 4个字节
double 8个字节
3.浮点型变量的精度
float 精度为8位
double 精度为17位
float a;
double b,c;
a = 123.456789;
b = a;
c = 123.456789;
printf("a=%f,b=%lf,c=%lf",a,b,c);
结果为:
a=123.456787,b=123.456787,c=123.456789
a为float的精度只有8位,故准确的值位123.45678,最后一位的7是随机的。同样b尽管是double 型,但是a赋值给b,b的值和a的一样。c为double型,精度为17为,故准确输出。
4.数据在内存中的表示
整数在内存中的表示:以补码形式存放
实数(浮点数)在内存中的表示:以指数形式存放(包含符号位,阶码,尾数),实数默认都是当作double处理的。
5.强制类型转换
自动转换:
(1)无符号短长度的数据类型->无符号或有符号长长度的数据类型
直接将无符号位短长度的数据类型的数据作为长长度的数据类型数据的低位部分,长长度的数据类型的高位部分补零。
xx……x ——>00……0 xx……x
代码:
unsigned char ch = -4;
int b ;//假设int的数据为16位
b = ch;
printf("%d\n",b);
结果为:252
分析:无符号char型为1个字节,8位
(-4)原码:1000 0100
(-4)补码:1111 1100
当赋值给int型的时候,
b的补码为:0000 0000 1111 1100
此时b为正数,补码=原码,真值为252
(2)有符号短长度的数据类型->无符号或有符号长长度的数据类型
直接将无符号位短长度的数据类型的数据作为长长度的数据类型数据的低位部分,然后将低位部分的最高位(即有符号短长度数据的符号位)向长长度的数据类型数据的高位部分拓展.
zx……x ——>zz……z zx……x
代码:
char ch = -4;
int b ;
b = ch;
printf("%d\n",b);
结果:-4
分析:有符号char型为1个字节,8位
(-4)原码:1000 0100
(-4)补码:1111 1100
当赋值给int型的时候,
b的补码为:1111 1111 1111 1100
b为负数,故(b)原码:1000 0000 0000 0100=-4
(3)长长度的数据类型->短长度的数据类型
直接截取长长度的数据类型的低位部分,作为短长度数据类型的数据。
yy……y xx……x —–> xx……x
代码:
int b = -256;
char ch;
ch = b;
printf("%d\n",ch);
结果:0
分析:b的原码为:1000 0001 0000 0000,b的补码为:1111 1111 0000 0000
ch为char类型的,故直接截取b的后8位:0000 0000 =0
(4)长度相同的数据类型转换
数据按照原样复制即可。