整形提升和算术转换

1.什么叫整形提升,就得搞清楚什么是整形。这里不过多介绍。这里知识会涵盖,下列介绍时也会用到,希望大家先去搜搜其他得博客或者书籍了解一下。

首先整形家族有:char ,short(short int), int ,long,long  long。上述类型都可以在前面加unsigned变成无符号数(二进制里面得第一位不作为符号位,作为计数位)。这里说明,char相当于是整形,因为存得字符实际上是ASCII码值,所以也算整形。

如:

    char a = 98;

    printf("%c", a);

    printf("%d", a);

打印结果就是“b”字符,所以char算是整形,下一个打印又是98。

那么就进入整形提升,这里就涉及到内存。我们知道,整形数据实际在机器里面是以补码来进行运算得。并且是以补码进行的。那么当把一个char类型的数据赋值给int是怎么样的呢。这里面就是整形提升。

        char a = 128;

        int b = a;

        printf("%d", a);

        printf("%d",b);

//这里a的值是多少呢?

打印发现,a,b的值是-128.那为什么会这样呢。就是整形提升和整形截断的原因。我们知道,在存储数据的时候,实际机器是以二进制的补码进行存储和运算的。运算关系是:符号位不变,原码就是数据直接转换位二进制的码,反码是原码每位二进制位按位取反,反码加一得到补码。如果是无符号数或者是正数,就三码相同

而char 1个字节:8个bit位

int 4个字节:32个bit位。

char a = 128;//这里其实存储的时候已经存在整形截断了,机器一般默认数字会是整形。

那么128的原码:00000000000000000000000010000000

                反码:1111111111111111111111111111011111111

                补码:111111111111111111111111111110000000

而由于存储的时候,只能由八个字节,也就是8个二进制位。那么前面的就会砍掉,只留下最后面八位,作为a的补码存入储存器。

那么a所储存的补码就是10000000;

接下来就是整形提升,那么你在把a的值赋值给整形,或者以整形打印。

整形提升的规则:有符号数,整形提升时补充符号位。无符号数补充时,补充0;

那么这里a的补码就要整形提升,且a是有符号数,那么就补充1,

a的整形补码形式:11111111111111111111111110000000;

其所对应的反码:  111111111111111111111111101111111;

对应的原码:         10000000000000000000010000000;//有符号数,那么就是-128

者就是char对应的整形提升,对应的short, 是类似的。

再来看非符号数,这里讲一下整形截断来举例,非符号数整形提升按照上述规则来即可。        

        unsigned char a ;

        int b = 256;

        a = b;//其结果是多少呢?

        printf("%d\n",a);//打印结果是0;

上述原理类似;这里不在啰嗦:

b 的补码:00000000000000000000000100000000;

那么把这个进行整形截断,只取后八位,则全部都是0;

这个全部都是0的补码,自然对应的打印结果就是0;

算术转换:当int 遇见float,unsigned int ,unsigned float,long ,longlong,unsigned long等比int长或者是,那么int就会转换位对应算法,和整形提升类似。int就换发生变化,转换位对应类型数据

 根据算术转换的规则,一种类型遇见类型更高的类型,要进行算术转换。

具体是int ,unsigned int ,long ,unsigned long, longlong ,unsigned long long ,float, unsigned float ,double float ,

int转换为float,因为float表示范围更大。float型储存方式不太一样。具体查IEEE标准

这里以int和float举例子。

         int a = 300;

        float b = 1.23;

        printf("%f",a + b);
     打印结果:301.230011;尾数的11于IEEE标准有关,就是在转换的一些问题。这里不做赘述。

在300转换的时候,符号位依然是符号位,但是会转换为二进制的科学计数法,并且储存。进行加减即可。

        printf("%d",a + b);//536870912

        这里在打印结果的时候,我们发现结果很大,原因就是在计算的时候,会根据顺序进行算术转换,那么结果就是算术转换之后的结果也就是float型,但是这里打印整形,在二进制储存之中,float储存方式不同,但是字节大小却一样。那么系统在打印的时候,会把其当做整形,从而进行打印,导致了最终的打印结果的差异。具体可以了解IEEE标准后去计算。

        printf("%f  \n", a);0。0000000

这里原因类似,因为储存方式不同,运行的时候,所读取的结果也不一样。

        

本文章为学习之后总结的笔记型。欢迎错误和补充

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
后台采用apache服务器下的cgi处理c语言做微信小程序后台逻辑的脚本映射。PC端的服务器和客户端都是基于c语言写的。采用mysql数据库进行用户数据和聊天记录的存储。.zip C语言是一种广泛使用的编程语言,它具有高效、灵活、可移植性强等特点,被广泛应用于操作系统、嵌入式系统、数据库、编译器等领域的开发。C语言的基本语法包括变量、数据类型、运算符、控制结构(如if语句、循环语句等)、函数、指针等。下面详细介绍C语言的基本概念和语法。 1. 变量和数据类型 在C语言中,变量用于存储数据,数据类型用于定义变量的类型和范围。C语言支持多种数据类型,包括基本数据类型(如int、float、char等)和复合数据类型(如结构体、联合等)。 2. 运算符 C语言中常用的运算符包括算术运算符(如+、、、/等)、关系运算符(如==、!=、、=、<、<=等)、逻辑运算符(如&&、||、!等)。此外,还有位运算符(如&、|、^等)和指针运算符(如、等)。 3. 控制结构 C语言中常用的控制结构包括if语句、循环语句(如for、while等)和switch语句。通过这些控制结构,可以实现程序的分支、循环和多路选择等功能。 4. 函数 函数是C语言中用于封装代码的单元,可以实现代码的复用和模块化。C语言中定义函数使用关键字“void”或返回值类型(如int、float等),并通过“{”和“}”括起来的代码块来实现函数的功能。 5. 指针 指针是C语言中用于存储变量地址的变量。通过指针,可以实现对内存的间接访问和修改。C语言中定义指针使用星号()符号,指向数组、字符串和结构体等数据结构时,还需要注意数组名和字符串常量的特殊性质。 6. 数组和字符串 数组是C语言中用于存储同类型数据的结构,可以通过索引访问和修改数组中的元素。字符串是C语言中用于存储文本数据的特殊类型,通常以字符串常量的形式出现,用双引号("...")括起来,末尾自动添'\0'字符。 7. 结构体和联合 结构体和联合是C语言中用于存储不同类型数据的复合数据类型。结构体由多个成员组成,每个成员可以是不同的数据类型;联合由多个变量组成,它们共用同一块内存空间。通过结构体和联合,可以实现数据的封装和抽象。 8. 文件操作 C语言中通过文件操作函数(如fopen、fclose、fread、fwrite等)实现对文件的读写操作。文件操作函数通常返回文件指针,用于表示打开的文件。通过文件指针,可以进行文件的定位、读写等操作。 总之,C语言是一种功能强大、灵活高效的编程语言,广泛应用于各种领域。掌握C语言的基本语法和数据结构,可以为编程学习和实践打下坚实的基础。
算术表达式转换为后缀表达式的步骤如下: 1. 创建一个空的栈和一个空的输出队列。 2. 从左到右扫描中缀表达式。 3. 如果扫描到的是操作数,将其入输出队列。 4. 如果扫描到的是左括号,将其压入栈中。 5. 如果扫描到的是右括号,则将栈中的元素依次弹出并入输出队列,直到遇到左括号为止。左括号右括号都不输出到结果队列。 6. 如果扫描到的是运算符,判断其优先级: - 如果该运算符的优先级低于或等于栈顶运算符的优先级,则将栈顶运算符弹出并入输出队列,直到栈为空或者栈顶运算符优先级低于该运算符。 - 将该运算符压入栈中。 7. 重复步骤2到6,直到扫描完整个中缀表达式。 8. 如果栈中还有运算符,将它们依次弹出并入输出队列。 9. 输出队列中的元素就是后缀表达式。 例如,将中缀表达式 "5 + 4 * 3 - 2" 转换为后缀表达式: 1. 创建一个空的栈和一个空的输出队列。 2. 从左到右扫描中缀表达式,首先遇到操作数 "5",将其入输出队列。 3. 遇到运算符 "+",将其压入栈中。 4. 遇到操作数 "4",将其入输出队列。 5. 遇到运算符 "*",由于 "*" 的优先级高于 "+",所以将 "*" 压入栈中。 6. 遇到操作数 "3",将其入输出队列。 7. 遇到运算符 "-",由于 "-" 的优先级低于 "*",所以将 "*" 弹出并入输出队列,然后将 "-" 压入栈中。 8. 遇到操作数 "2",将其入输出队列。 9. 扫描完整个表达式后,将栈中剩余的运算符依次弹出并入输出队列,得到后缀表达式 "5 4 3 * + 2 -"。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值