D4数据类型转换

来源:互联网 发布:小米2s改装4g网络 编辑:程序博客网 时间:2024/06/10 03:12
int a = -12;
printf("%u", a);
//4294967284


-12
源码:10000000 00000000 00000000 00001100
反码:11111111 11111111 11111111 11110011
补码:11111111 11111111 11111111 11110100




当我们用%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: 10000001char型占一个字节
b   -------- --------   占两个字节  
    -------- 10000001   后面八位直接搬进来
因为b是有符号类型,所以高八位需要补符号位,而此时符号位是1
所以补全之后的数据存储形式如下:
11111111 10000001
注意! 注意! 注意! 计算机存储数据是存的是二进制补码.
所以读取改数据时要还原成原码,正数不用管,负数则要遵循转换规则:
原码 = 反码取反
反码 = 补码 - 1;
反推得到原码: 10000000 11111111   即:-127;


家庭作业:


1,已知 short a = x; char b = a;
如果printf("%c",b),得到'E',
请问1000以内,x的值可以是多少?

2,-3%7;  -7%2,  131%11;  (-17)%(-12); -12%9;  9%-4;


3,将一个四位数abcd,变为dabc, 如:1234 转化成 4123;


4,定义一个整形的变量,值为你们的手机号码,假设这是你的寿命单位为秒,
  假设一年 = 12月, 一月= 30天,
  请将你的寿命转化成:X年X月X天X时X分X秒的格式输出. 
原创粉丝点击