C 数据类型转换

来源:互联网 发布:对p2p网络信贷的看法 编辑:程序博客网 时间:2024/06/02 02:33

int a = -12;
printf(“%u”, a);
//4294967284

int a = 24;
00000000 00000000 00000000 00011000 原码
00000000 00000000 00000000 00011000 反码
00000000 00000000 00000000 00011000 补码

最高位代表符号位,0表示正,1表示负,只针对于有符号类型的数据.
整数的原码,反码,补码是一样的.

int b = -24
10000000 00000000 00000000 00011000 原码
11111111 11111111 11111111 11100111 反码(在原码基础上取反,符号位不参与取反过程)
11111111 11111111 11111111 11101000 补码(在反码的基础上+1)

当我们用%u格式控制符输出a时,计算机将会把它识别为
一个无符号的正整数.此时最高位上原本作位符号位的1
将被当作计数位,同时因为整数的原码反码补码是一样
的,所以直接输出得到4294967284;

数据转换:
当不同类型的数据参与运算时,低字节数据会自动转换为高字节数据的类型.
当给数据赋值时,等号右边的数据类型会自动转换成等号左边的数据类型.
float a = 1.3f, b = 1.5f;
float c1 = (int)(a + b), c2 = (int)a + b;
printf(“%f,%f”,c1 ,c2);
printf(“%lf”, (double)3 / 2);
printf(“%lf”, (double)(3/2));

强制转换得到所需类型的中间变量,原变量类型、变量值保持不变

精度缺失:发生在多字节数类型强制转化为少字节数类型时.
short a = 258; 97+128 //+256//+512
char b = a;
printf(“%c”,b);
00000001 01100001
01100001

当少字节数转化为多字节数的时候,多出来的位需要补0或补符号位.
具体取决于多字节数的类型是有符号还是无符号.
如果是无符号,统一补0,如果是有符号则将低字节数的最高位当作符号位去补.
如:
char a = 129;
short b = a;
a 129: 10000001 char型占一个字节
b ——– ——– 占两个字节
——– 10000001 后面八位直接搬进来
因为b是有符号类型,所以高八位需要补符号位,而此时符号位是1
所以补全之后的数据存储形式如下:
11111111 10000001
注意! 注意! 注意! 计算机存储数据是存的是二进制补码.
所以读取改数据时要还原成原码,正数不用管,负数则要遵循转换规则:
原码 = 反码取反
反码 = 补码 - 1;
反推得到原码: 10000000 11111111 即:-127;