C语言细节——献给入门者(三)

C语言细节——献给入门者(三)

>>主题:关于强制类型转换

  先来瞎扯下强制类型转换,c语言有诸多数据类型,long,short,int,float,double,bool,char等等。当我们若用同样种多少列赋值给另外一样栽多少类,或者以有操作数进行如此的转会的下,就因此到了挟持类型转换。 

*  强制类型转换分成两种植:*1.显得强制类型转换(主动)  2.隐式强制类型转换(被动/自动)

  要有别于这二者很简短,看下面例子:(we assume that b is a variable of
integer.)

char a = (char)b;

char a = b;

 所以区分两者只要看这个(char)是否显式的状出来。但咱设留心,这半单之别绝对不是这么简单。让咱们看下去…

》》》苟一个运算符两限的运算数类型不同,先使用那易为同一的门类,即于逊色类型转换为于高路,然后重新与运算,转换规则如下图所示。

即段和及时图是自个儿百度来之,他说算机会主动把float,int分别转换成double,long计算,后来纪念来转意识同计算机组成学的非同等,况且只要还这么算,那还索要多少数据类型干嘛呢?计算机速度何必不得用双精度来测量?后来自家好测了转,发现果然是胡说,我就算毫无此图说啦~(附上测试代码)

  (ps:以下按int为32员来验证):      

      C语言 1

测试代码:

#include <stdio.h>
int main()
{
    int a=1,b=2;
    int c=a+b;
    long aa=2,cc=4;
    long bb=aa+cc;

    printf("%d\n",c );
    printf("%ld\n",bb );
    return 0;
}

反汇编后所得(部分代码):

 1     movl    $0, -4(%rbp)
 2     movl    $1, -8(%rbp)
 3     movl    $2, -12(%rbp)
 4     movl    -8(%rbp), %eax
 5     addl    -12(%rbp), %eax
 6     movl    %eax, -16(%rbp)
 7     movq    $2, -24(%rbp)
 8     movq    $4, -32(%rbp)
 9     movq    -24(%rbp), %rcx
10     addq    -32(%rbp), %rcx
11     movq    %rcx, -40(%rbp)
12     movl    -16(%rbp), %esi
13     movb    $0, %al

备感一下子由乱我思路了,让自家捋一捋。。。

》》》先押下零星单先行级的事例,很多人口恐怕没有留神到:

num = (double)k/m;

在此间,无论double是挟持类型转换了k还是k/m,答案都如出一辙;但这边的double是修饰k的,因为括号的预级是大于/的;

倘若想如果double修饰k/m的话语就是足以这样做:

num = (double)(k/m);

另外一个例子:

a  =  (int)father->age;

这里很明显int是修饰age的,因为father是匪克强制类型转换成int类型的;这里是为->的先期级高于括号;

 

》》》接下去省关于数据类型的几栽例

case 1:

int a,b=2;
a=(int)b; 

这里 因为a,b都是int型,所以就边的(int)可以免用,即显式隐式都是好的;

case 2:

int a;
char b='A';
a=(int)b; 

char a;
int b=65;
a=(char)b;

第一是例子能换是因字符和整型之间可以经过ascii码转换,其次char占一个字节而int占4只字节;

每当面前一个运给小数的情景下,显式隐式编译器都经过,但是充分有或引致溢起,所以用团结在意;

后一个系统自动会把b扩成4字节赋值给a(b还是1字节)

case 3:

int b=-1;
unsigned int a;
a=b;
printf("%d\n",a);

这里unsigned int的范围是0~65535
,其实当a=b后,a的价是65535,但输出却是-1;我同样开始没想通,加了显式转换之后尝试了转还是-1,后来才知道%d输出是发号子的int类型,所以输出结果要么-1;

说及此自己想开之前一个学弟问我%e的题材;

那是书上的一个例证,输入用%e,输出却因此%f,他直接飞为什么输出是71.820000设非是7.182000e+01C语言;

你不用%e输出,怎么会看出7.182000e+01为?就算你用%f输入%e输出为能望如此的形式啊。

本身以为学语言不可知光学个语法,重点需要了解多少是安存在吃计算机中的。

您得理解不管哪输入输出,同样的数目是计算机中是无换的,只是我们在屏幕上观望的显示方式不同等只要都,就像一个月饼,有包和无包装它就是是个月饼,里面的馅还是颇馅。

闲聊的产生硌多矣。今天优先勾勒及此处出来吧。下次还添,EDG炸了我看之特别为难给=
=。

========================================================================================

2015/11/16 补充:

此次续主要因《The C Programming Language》

C语言 2

 C语言 3

 

C语言 4

 1 #include <stdio.h>
 2 
 3 int main()
 4 {
 5     short x = 65535+65535;//-2
 6 
 7     short x1 = 65535;    //取余 但是可以为负数
 8 
 9     short x2 = 65537;    //取余后的最小非负整数
10     unsigned short y = 65537;    //取余后的最小非负整数
11 
12     printf("x1=%d   x2=%d\n" , x1 , x2);
13     printf("y = %d\n", y );
14     return 0;
15 
16 }

C语言 5

C语言 6

C语言 7C语言 8

ps

当表达式中包含 u n s i g n e d 类 型 的 运 算 分 量 时 , 转 换 规 则 要
复 杂 一 些 。 主 要 问 题 是 , 在 有 符 号
值与无符号值之间的可比运算取决于机器,因为它们在各个整数类型的大大小小。例如,假定
i n t 对象占 1 6 位, l o n g 对象占 3 2 位,那么,- 1 L < 1 U ,这是以
i n t 类型的- 1 U 被升级也 s i g n e d l o n g 类型;但- 1 L > 1 U L ,
这 是 因 为 – 1 L 被升级也 u n s i g n e d l o n g 类 型 , 因 此 它 是
一 个 比 较 大 的 正 数 。

每当拓展赋值时也要是拓展类型转换, =
右边的值要转换成左边变量的门类,后者即赋值表达式 结果的项目。

如前所述,不管是不是如进行标记扩展,字符值都使更换成整数值。

当把于丰富之整型数易成为于短的整型数要字符时,要拿过的高位部分丢掉。