【C语言】 操作符(上): -- 算数 -- 移位 -- 位操作符 -- 赋值 -- 单目 -- 关系 -- 逻辑操作符1

简介: 【C语言】 操作符(上): -- 算数 -- 移位 -- 位操作符 -- 赋值 -- 单目 -- 关系 -- 逻辑操作符1

************************************************正文开始***********************************************

1、算数操作符

算术操作符:+、-、*、/、%

1.除了 % 操作符之外,其他的几个操作符可以作用于整数和浮点数;

2.对于 / 操作符如果两个数都为整数,执行整数除法,而只要有浮点数执行的就是整数除法;

3.% 操作符的两个操作数必须为整数,返回的是整除之后的余数。

我们看看代码来对这三点加深印象:

我们先来看 / 和 % :

#include <stdio.h>
int main()
{
    //  / 除法 - 得到的是商
    //  % 取模(取余)- 得到的是余数
    printf("%d\n", 10/2.0);
    printf("%lf\n", 10/3.0);
    printf("%d\n", 10/2.0);
    printf("%d\n", 10%2);
    return 0;
}

效果展示:


第三行打印怎么不是 5 呢,我们来分析一下:



因此应该使用 %lf 打印。

我们对代码进行改正:

#include <stdio.h>
int main()
{
    //  / 除法 - 得到的是商
    //  % 取模(取余)- 得到的是余数
    printf("%d\n", 10/2);
    printf("%lf\n", 10/3.0);
    printf("%lf\n", 10/2.0);
    printf("%d\n", 10%2);
    return 0;
}

效果展示:


这个例子就是验证了第二条:对于 / 操作符如果两个数都为整数,执行整数除法,而只要有浮点数执行的就是整数除法。

我们再来看看 % :

这里就印证了第三条:% 操作符的两个操作数必须为整数,返回的是整除之后的余数。

2、移位操作符

<< 左移操作符


>> 右移操作符


注:移位操作符的操作数只能是整数。移动的是二进制的位。


10进制的数据中:都是0~9的数字组成的;


8进制的数据中:都是0~7的数字组成的;


2进制的数据中:都是0~1的数字组成的。


10进制的数字都有自己的权重,比如 123:



2进制的数字也是一样有自己的权重,比如 1010:



8进制的数字也是一样,比如 12:

16进制(范围:0~15)的每一位:0 1 2 3 4 5 6 7 8 9 A B C D E F

因此,16进制表示10就是 A。

2.1 原码、反码、补码

整数:

整数的二进制表示形式有 3 种方式:原码、反码、补码

原码:把一个数按照正负直接翻译成二进制就是原码。

反码:符号位不变,其他位按位取反。

补码:反码 +1。
注:正整数的原码反码补码是相同的。(正整数写出原码就是反码和补码。负整数的原反补码需要根据以上规律计算)


举例:写出 5,-5的原码、反码、补码


5,-5是整数,整数是存放在整型变量中的,一个整型变量是 4 个字节 -- 32个比特位。


我们以 32 位来描述 5,5 用二进制表示为 101(这已经是3个比特位了),高位我们用 0 来补齐。因此5的二进制表示为:


00000000 00000000 00000000 00000101


注:第一个 0 表示的是最高位,最高位是符号位,正数的符号位表示为 0,负数的符号位表示为 1。


因为 -5 的二进制表示为:


10000000 00000000 00000000 00000101


5的原、反、补码:


00000000 00000000 00000000 00000101


-5的原、反、补码:


原码:10000000 00000000 00000000 00000101


反码:11111111 11111111 11111111 11111010


补码:11111111 11111111 11111111 11111011


整数在内存中存储的是补码二进制。


我们验证一下:

#include <stdio.h>
int main()
{
    int a = -5;
    printf("%d\n", a);
    return 0;
}

内存中的 -5 存储展示:


我们来分析一下为什么是这样

内存中是以十六进制存储的,f 代表了 15。

编译器中是反着存的,所以是 fb ff ff ff 。这就验证了,二进制在内存中存的是补码。

相关文章
|
2月前
|
C语言
C语言判断逻辑的高阶用法
在C语言中,高级的判断逻辑技巧能显著提升代码的可读性、灵活性和效率。本文介绍了六种常见方法:1) 函数指针,如回调机制;2) 逻辑运算符组合,实现复杂条件判断;3) 宏定义简化逻辑;4) 结构体与联合体组织复杂数据;5) 递归与分治法处理树形结构;6) 状态机管理状态转换。通过这些方法,可以更高效地管理和实现复杂的逻辑判断,使代码更加清晰易懂。
229 88
|
26天前
|
存储 缓存 C语言
【c语言】简单的算术操作符、输入输出函数
本文介绍了C语言中的算术操作符、赋值操作符、单目操作符以及输入输出函数 `printf` 和 `scanf` 的基本用法。算术操作符包括加、减、乘、除和求余,其中除法和求余运算有特殊规则。赋值操作符用于给变量赋值,并支持复合赋值。单目操作符包括自增自减、正负号和强制类型转换。输入输出函数 `printf` 和 `scanf` 用于格式化输入和输出,支持多种占位符和格式控制。通过示例代码详细解释了这些操作符和函数的使用方法。
34 10
|
1月前
|
存储 编译器 C语言
【C语言】简单介绍进制和操作符
【C语言】简单介绍进制和操作符
160 1
|
1月前
|
存储 编译器 C语言
初识C语言5——操作符详解
初识C语言5——操作符详解
171 0
|
1月前
|
编译器 C语言 C++
【C语言】精妙运用内存函数:深入底层逻辑的探索
【C语言】精妙运用内存函数:深入底层逻辑的探索
|
1月前
|
C语言 C++
C语言 之 内存函数
C语言 之 内存函数
33 3
|
6天前
|
C语言
c语言调用的函数的声明
被调用的函数的声明: 一个函数调用另一个函数需具备的条件: 首先被调用的函数必须是已经存在的函数,即头文件中存在或已经定义过; 如果使用库函数,一般应该在本文件开头用#include命令将调用有关库函数时在所需要用到的信息“包含”到本文件中。.h文件是头文件所用的后缀。 如果使用用户自己定义的函数,而且该函数与使用它的函数在同一个文件中,一般还应该在主调函数中对被调用的函数做声明。 如果被调用的函数定义出现在主调函数之前可以不必声明。 如果已在所有函数定义之前,在函数的外部已做了函数声明,则在各个主调函数中不必多所调用的函数在做声明
21 6
|
19天前
|
存储 算法 程序员
C语言:库函数
C语言的库函数是预定义的函数,用于执行常见的编程任务,如输入输出、字符串处理、数学运算等。使用库函数可以简化编程工作,提高开发效率。C标准库提供了丰富的函数,满足各种需求。
|
25天前
|
机器学习/深度学习 C语言
【c语言】一篇文章搞懂函数递归
本文详细介绍了函数递归的概念、思想及其限制条件,并通过求阶乘、打印整数每一位和求斐波那契数等实例,展示了递归的应用。递归的核心在于将大问题分解为小问题,但需注意递归可能导致效率低下和栈溢出的问题。文章最后总结了递归的优缺点,提醒读者在实际编程中合理使用递归。
53 7
|
25天前
|
存储 编译器 程序员
【c语言】函数
本文介绍了C语言中函数的基本概念,包括库函数和自定义函数的定义、使用及示例。库函数如`printf`和`scanf`,通过包含相应的头文件即可使用。自定义函数需指定返回类型、函数名、形式参数等。文中还探讨了函数的调用、形参与实参的区别、return语句的用法、函数嵌套调用、链式访问以及static关键字对变量和函数的影响,强调了static如何改变变量的生命周期和作用域,以及函数的可见性。
29 4