当前位置: 首页 > news >正文

C语言中的一些小知识(二)

一、"%"运算符两侧只能是整数

在C语言中,`%` 运算符称为模运算符或取余运算符,它用于计算两个整数相除后的余数。当使用 `%` 运算符时,操作数必须是整数类型(包括 `char`、`int`、`long` 等)。

语法

remainder = dividend % divisor;

- **dividend**:被除数
- **divisor**:除数
- **remainder**:结果,即被除数除以除数后的余数

规则
1. **符号规则**:如果被除数和除数都是正数或都是负数,余数的符号与被除数相同。如果被除数和除数符号不同,余数的符号与除数相同。
2. **零除错误**:除数不能为零,否则会导致运行时错误。

 示例
以下是使用 `%` 运算符的一些示例:

#include <stdio.h>int main() {int a = 10;int b = 3;int c = -10;int d = -3;// 正数除以正数printf("10 %% 3 = %d\n", a % b);  // 输出 1// 负数除以正数printf("-10 %% 3 = %d\n", c % b);  // 输出 2// 正数除以负数printf("10 %% -3 = %d\n", a % d);  // 输出 -2// 负数除以负数printf("-10 %% -3 = %d\n", c % d);  // 输出 -1return 0;
}

 注意事项
- 在使用 `%` 运算符时,确保除数不为零。
- 余数的符号取决于被除数和除数的符号,这在进行算术运算时需要特别注意。

 应用场景
模运算符在多种场景中非常有用,例如:
- 检查一个数是否是另一个数的倍数。
- 在循环中进行周期性操作。
- 计算日期和时间(例如,计算今天是星期几)。

模运算符是整数运算中的基本工具,掌握其用法对于进行有效的整数运算至关重要。

二、printf()函数输出的数据都隐含右or左对齐

下面是一个简单的C程序,用来验证printf()函数在不同情况下的对齐方式:

#include <stdio.h>int main() {int num = 123;double pi = 3.14159;char str[] = "Moonshot";// 默认右对齐printf("Right aligned (default):\n");printf("%10d\n", num); // 整数,默认右对齐printf("%10.2f\n", pi); // 浮点数,默认右对齐printf("%10s\n", str); // 字符串,默认右对齐// 显式右对齐printf("\nRight aligned (explicit):\n");printf("%10d\n", num); // 整数,显式右对齐printf("%10.2f\n", pi); // 浮点数,显式右对齐printf("%10s\n", str); // 字符串,显式右对齐// 左对齐printf("\nLeft aligned:\n");printf("%-10d\n", num); // 整数,左对齐printf("%-10.2f\n", pi); // 浮点数,左对齐printf("%-10s\n", str); // 字符串,左对齐return 0;
}

在这个程序中,我们定义了一个整数num,一个浮点数pi,和一个字符串str。然后我们分别使用默认的右对齐、显式指定的右对齐和左对齐来输出这些变量。

当你运行这个程序时,你会看到以下输出:

Right aligned (default):1233.14MoonshotRight aligned (explicit):1233.14MoonshotLeft aligned:
123
3.14
Moonshot
请按任意键继续. . .

请注意,对于字符串,左对齐不会在字符串后面添加额外的空格,因为字符串的长度已经确定了。对于整数和浮点数,左对齐会在数值的左侧添加空格,直到达到指定的宽度。

三、位运算(对象只能是整型和字符型数据)

位运算是计算机编程中对整数在二进制形式上进行的运算。位运算符在C语言中包括以下几种:

  1. 按位与(AND) - &

    • 两个位都为1(真)时,结果才为1(真)。
    • 例:5 & 3 的二进制表示为 00000101 & 00000011,结果是 00000001,即1。
  2. 按位或(OR) - |

    • 两个位中至少有一个为1(真)时,结果为1(真)。
    • 例:5 | 3 的二进制表示为 00000101 | 00000011,结果是 00000111,即7。
  3. 按位异或(XOR) - ^

    • 两个位相同则结果为0(假),不同则结果为1(真)。
    • 例:5 ^ 3 的二进制表示为 00000101^00000011,结果是 110,即6。
  4. 按位取反(NOT) - ~(一个简单的方法加一后,取其相反数)

    • 反转所有位,0变1,1变0。
    • 例:~5 的二进制表示为 11111010(假设是8位整数)。
  5. 左移(Left Shift) - <<

    • 将数字的所有位向左移动指定的位数,右边空出的位补0。
    • 例:5 << 1 的二进制表示为 101 << 1,结果是 00001010,即10。
  6. 右移(Right Shift) - >>

    • 将数字的所有位向右移动指定的位数,左边空出的位补符号位(有符号数)或0(无符号数)。
    • 例:5 >> 1 的二进制表示为 101 >> 1,结果是00000010,即2。

位运算在编程中非常有用,尤其是在需要优化性能和处理硬件级别的操作时。例如,位运算可以用来设置、清除、切换和检查特定位的状态,这在处理位掩码和标志时非常有用。

下面是一个简单的C语言示例,演示了这些位运算符的使用:

#include <stdio.h>int main() {int a = 5; // 二进制表示为 101int b = 3; // 二进制表示为 011// 按位与printf("a & b = %d\n", a & b);// 按位或printf("a | b = %d\n", a | b);// 按位异或printf("a ^ b = %d\n", a ^ b);// 按位取反printf("~a = %d\n", ~a);// 左移printf("a << 1 = %d\n", a << 1);// 右移printf("a >> 1 = %d\n", a >> 1);return 0;
}
a & b = 1
a | b = 7
a ^ b = 6
~a = -6
a << 1 = 10
a >> 1 = 2
请按任意键继续. . .

下面重点讲一下"~"按位取反符号

在C语言中,按位取反操作符 ~ 用于反转变量的所有位。对于整数 5,其按位取反的结果取决于整数的位数和是否有符号。

假设我们使用的是标准的8位整数(有符号整数),整数 5 的二进制表示(补码形式)如下:

00000101

应用按位取反操作:

11111010

在8位整数中,这将是一个很大的负数。在补码表示法中,负数是通过取反所有位然后加1来得到的。因此,要得到这个负数的原始值,我们需要从这个二进制数减去1,然后取反:

  11111010
- 00000001
------------11111001

然后取反:

0000010

这表示 -6。因此,对于8位整数,5 的按位取反结果是 -6

四、当例子为负数时位运算会有啥不同

下面是在上面的基础上一个简单的C语言示例,演示了这些位运算符的使用:

#include <stdio.h>int main() {int a = -5; // 二进制表示为 101int b = -3; // 二进制表示为 011// 按位与printf("a & b = %d\n", a & b);// 按位或printf("a | b = %d\n", a | b);// 按位异或printf("a ^ b = %d\n", a ^ b);// 按位取反printf("~a = %d\n", ~a);// 左移printf("a << 1 = %d\n", a << 1);// 右移printf("a >> 1 = %d\n", a >> 1);return 0;
}

在C语言中,整数是以补码形式存储的,所以负数的二进制表示不是直接的“101”和“011”。让我们来分析你提供的代码和预期的输出。

首先,让我们确定 ab 的二进制表示。假设我们使用的是32位整数:

  1. a = -5 的补码表示为:11111011
  2. b = -3 的补码表示为:11111101

现在,我们可以计算位运算的结果:

  1. 按位与(AND) - a & b

    • 11111011 & 11111101 = 11111001
    • 11111001 - 00000001 = 11111000
    • ~(11111000)=00000111
    • 00000111=7
    • -7
  2. 按位或(OR) - a | b

    • 11111011 & 11111101 =11111111 
    • 11111111 - 00000001= 11111110
    • ~(11111110) = 00000001
    • 00000001 = 1
    • -1
  3. 按位异或(XOR) - a ^ b

    • 11111011 & 11111101 =00000110
    • 00000110=6
  4. 按位取反(NOT) - ~a

    • 对于 a = -5,其补码表示为 11111011,取反后得到 00000100,即4.
  5. 左移(Left Shift) - a << 1(低位补零)

    • 11111011 << 1 = 11110110
    • 11110110- 00000001 = 11110101
    • ~(11110101) = 00001010
    • 00001010 = 10
    • -10
  6. 右移(Right Shift) - a >> 1 (高位补一)

    • 11111011 >> 1 = 11111101
    • 11111101 - 00000001 = 11111100
    • ~(11111100)= 00000011
    • 00000011 = 3
    • -3

因此,预期的输出将是:

a & b = -7
a | b = -1
a ^ b = 6
~a = 4
a << 1 = -10
a >> 1 = -3
请按任意键继续. . .

从以上例子我们可以得出结论

(1)负数在计算机存储的时候是一起补码的形式存储的

以-3为例其的补码二进制表示如下:

  1. 首先,找到3的二进制表示:00000011
  2. 然后,对该数进行按位取反操作:11111100
  3. 最后,将结果加1以得到补码:11111101

(2)在对负数进行左移右移操作的时候要遵循 左移低位补零,右移高位补一的原则

五、 

相关文章:

C语言中的一些小知识(二)

一、"%"运算符两侧只能是整数 在C语言中&#xff0c;% 运算符称为模运算符或取余运算符&#xff0c;它用于计算两个整数相除后的余数。当使用 % 运算符时&#xff0c;操作数必须是整数类型&#xff08;包括 char、int、long 等&#xff09;。 语法 remainder div…...

使用 Go 语言实现简单聊天系统

在互联网时代&#xff0c;聊天系统是常见的应用场景之一。无论是即时通讯、在线客服还是多人游戏中的消息系统&#xff0c;聊天功能的实现都是必不可少的。本文将使用 Go 语言&#xff0c;结合 WebSocket 来构建一个简单的多人聊天室系统。 一、项目结构 首先&#xff0c;我们…...

用友U8二次开发工具KK-FULL-*****-EFWeb使用方法

1、安装: 下一步&#xff0c;下一步即可。弹出黑框不要关闭&#xff0c;让其自动执行并关闭。 2、服务配置&#xff1a; 输入服务器IP地址&#xff0c;选择U8数据源&#xff0c;输入U8用户名及账号&#xff0c;U8登录日期勾选系统日期。测试参数有效性&#xff0c;提示测试通过…...

【经验帖】脏读和不可重复读的概念及影响

脏读和不可重复读是数据库事务并发执行时可能出现的两种数据一致性问题&#xff0c;它们对数据的一致性和完整性有着显著的影响。以下是脏读和不可重复读的具体影响&#xff1a; 脏读的影响 脏读发生在一个事务读取了另一个事务未提交的数据时。由于这些数据尚未被提交&#x…...

MTK zephyr平台:USB升级、枚举流程

一、USB升级流程 通过代码及log分析,当前平台升级过程在PL阶段进行 USB download相关代码 mtk/modules/hal/boot/preloader/platform/flashc/ mtk/modules/hal/boot/preloader/platform/board_name/flash/ mtk/modules/hal/boot/preloader/platform/board_name/src/drive…...

golang操作mysql利器-gorm

1、傻瓜示例 GORM通过将数据库表中的数据映射到面向对象的模型中&#xff0c;简化了数据库操作&#xff0c;使得开发者可以很方便的使用代码来操作数据库&#xff0c;而无需编写SQL语句。 目前有个mysql表&#xff1a;miniprogram_orders&#xff0c;其存储了所有用户对应的订…...

09 Shell Scriptfor循环结构语句

Shell Scriptfor循环结构语句 一、Shell FOR循环语句概述 ​ 属于shell的符合语句 ​ 可以看出帮助信息给出了两种语法 [rootlocalhost ~]# help for for: for NAME [in WORDS ... ] ; do COMMANDS; doneExecute commands for each member in a list.The for loop executes…...

【Java】并发集合

并发集合&#xff08;java.util.concurrent&#xff09; 一、List CopyOnWriteArrayList&#xff08;ReentrantLock实现线程安全&#xff09; &#xff08;1&#xff09;并发修改&#xff08;写操作&#xff09;时保证线程安全&#xff1a; 通过ReentrantLock实现多个线程并…...

活动邀请|景联文科技与您相约华为全联接大会2024

2024年9月19-21日&#xff0c;第九届华为全联接大会(简称&#xff1a;HUAWEICONNECT2024)将在上海世博展览馆和上海世博中心举办。 作为华为的旗舰盛会&#xff0c;本次大会以“共赢行业智能化”为主题将邀请思想领袖、商业精英、技术专家、合作伙伴、开发者等业界同仁&#xf…...

周边游|基于springBoot的周边游平台设计与实现(附项目源码+论文+数据库)

私信或留言即免费送开题报告和任务书&#xff08;可指定任意题目&#xff09; 目录 一、摘要 二、相关技术 三、系统设计 四、数据库设计 五、核心代码 六、论文参考 七、源码获取 一、摘要 在如今社会上&#xff0c;关于信息上面的处理&#xff0c;没有任…...

【编程基础知识】mysql是怎样执行一条sql语句的,涉及到哪些环节步骤是,mysql的整体体系结构是啥样的,有哪些组件

一、步骤 MySQL执行一条SQL语句的过程涉及多个环节和步骤。以下是这一过程的概述&#xff1a; 客户端连接&#xff1a;客户端通过连接器&#xff08;Connector&#xff09;向MySQL服务器发起连接请求。身份验证&#xff1a;连接器对用户身份进行验证&#xff0c;确保用户有权…...

如何上传tauri项目到csdn gitcode

如何上传tauri项目到csdn gitcode 首先保证项目目录有.gitignore&#xff0c;避免不必要的文件上传分享。 gitignore文件 # Logs logs *.log npm-debug.log* yarn-debug.log* yarn-error.log* pnpm-debug.log* lerna-debug.log*node_modules dist dist-ssr *.local# Editor …...

【速成Redis】02 Redis 五大基本数据类型常用命令

前言&#xff1a; 上一节课&#xff0c;我们对redis进行了初步了解&#xff0c;和安装好了redis。【速成Redis】01 Redis简介及windows上如何安装redishttps://blog.csdn.net/weixin_71246590/article/details/142319358?spm1001.2014.3001.5501 该篇博客&#xff0c;我们正…...

UnLua扩展C++函数和蓝图自定义事件

一、通过BlueprintImplementableEvent标记扩展C函数 1、 这个标记表示C不需要实现&#xff0c;让蓝图/Lua重写。 2、首先在C中将LuaImp函数标记为BlueprintImplementableEvent&#xff0c;不需要实现&#xff0c;然后再GetIndex中调用该函数。 MyBaseActor.h UFUNCTION(Bluepr…...

干耳屎硬掏不出来怎么办?质量最好的可视挖耳勺推荐

很多干耳的小伙伴都会用普通耳勺来掏耳朵。由于普通耳勺由于其盲操作的特性&#xff0c;对于耳道非直线结构的清理存在诸多不便。所以市面上出现了可视挖耳勺&#xff0c;让我们清晰的看到自己耳道&#xff0c;更加安全的清洁耳朵。&#xff0c;可视挖耳勺这款产品在市场上越来…...

谷歌 Chrome 最新版升级:更强的安全检查功能守护你的上网安全

谷歌 Chrome 浏览器产品经理 Andrew Kamau 在最新发布的博文中宣布&#xff0c;Chrome 浏览器迎来了新一轮的安全升级。新版 Chrome 在后台自动运行安全检查功能&#xff0c;采取了额外的主动措施来保障用户的安全。 自动撤销通知权限 新版 Chrome 浏览器采用了一项基于谷歌安…...

深度学习自编码器 - 收缩自编码器(CAE)篇

序言 在深度学习的浪潮中&#xff0c;收缩自编码器&#xff08; Compressive Autoencoder, CAE \text{Compressive Autoencoder, CAE} Compressive Autoencoder, CAE&#xff09;作为自编码器的一种高级形式&#xff0c;正逐步崭露头角。收缩自编码器在保留自编码器核心功能—…...

Dubbo与SpringCloud的区别和优缺点

经常会有同学问我&#xff0c;Dubbo和SpringCloud的选择。甚至也经常会有面试官就这个问题刨根问底。 说实话&#xff0c;其实我不太喜欢回答这个问题&#xff0c;本质上来讲&#xff0c;Dubbo的SpringCloud可以算是完全不同赛道的两种东西&#xff0c;就好像问大家西瓜和土豆我…...

★ C++进阶篇 ★ 多态

Ciallo&#xff5e;(∠・ω< )⌒☆ ~ 今天&#xff0c;我将继续和大家一起学习C进阶篇第二章----多态 ~ ❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️ 澄岚主页&#xff1a;椎名澄嵐-CSDN博客 C基础篇专栏&#xff1a;★ C基础篇 ★_椎名澄嵐的博客-CSDN博客 …...

pg入门3—详解tablespaces2

pg默认的tablespace的location为空&#xff0c;那么如果表设置了默认的tablespace&#xff0c;数据实际上是存哪个目录的呢? 在 PostgreSQL 中&#xff0c;如果你创建了一个表并且没有显式指定表空间&#xff08;tablespace&#xff09;&#xff0c;或者表空间的 location 为…...

XCTF-web-easyupload

试了试php&#xff0c;php7&#xff0c;pht&#xff0c;phtml等&#xff0c;都没有用 尝试.user.ini 抓包修改将.user.ini修改为jpg图片 在上传一个123.jpg 用蚁剑连接&#xff0c;得到flag...

C++:std::is_convertible

C++标志库中提供is_convertible,可以测试一种类型是否可以转换为另一只类型: template <class From, class To> struct is_convertible; 使用举例: #include <iostream> #include <string>using namespace std;struct A { }; struct B : A { };int main…...

智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql

智慧工地管理云平台系统&#xff0c;智慧工地全套源码&#xff0c;java版智慧工地源码&#xff0c;支持PC端、大屏端、移动端。 智慧工地聚焦建筑行业的市场需求&#xff0c;提供“平台网络终端”的整体解决方案&#xff0c;提供劳务管理、视频管理、智能监测、绿色施工、安全管…...

dedecms 织梦自定义表单留言增加ajax验证码功能

增加ajax功能模块&#xff0c;用户不点击提交按钮&#xff0c;只要输入框失去焦点&#xff0c;就会提前提示验证码是否正确。 一&#xff0c;模板上增加验证码 <input name"vdcode"id"vdcode" placeholder"请输入验证码" type"text&quo…...

Vue2 第一节_Vue2上手_插值表达式{{}}_访问数据和修改数据_Vue开发者工具

文章目录 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染2. 插值表达式{{}}3. 访问数据和修改数据4. vue响应式5. Vue开发者工具--方便调试 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染 准备容器引包创建Vue实例 new Vue()指定配置项 ->渲染数据 准备一个容器,例如: …...

Python爬虫(二):爬虫完整流程

爬虫完整流程详解&#xff08;7大核心步骤实战技巧&#xff09; 一、爬虫完整工作流程 以下是爬虫开发的完整流程&#xff0c;我将结合具体技术点和实战经验展开说明&#xff1a; 1. 目标分析与前期准备 网站技术分析&#xff1a; 使用浏览器开发者工具&#xff08;F12&…...

从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)

设备树移植 和uboot设备树修改的内容同步到kernel将设备树stm32mp157d-stm32mp157daa1-mx.dts复制到内核源码目录下 源码修改及编译 修改arch/arm/boot/dts/st/Makefile&#xff0c;新增设备树编译 stm32mp157f-ev1-m4-examples.dtb \stm32mp157d-stm32mp157daa1-mx.dtb修改…...

06 Deep learning神经网络编程基础 激活函数 --吴恩达

深度学习激活函数详解 一、核心作用 引入非线性:使神经网络可学习复杂模式控制输出范围:如Sigmoid将输出限制在(0,1)梯度传递:影响反向传播的稳定性二、常见类型及数学表达 Sigmoid σ ( x ) = 1 1 +...

CSS设置元素的宽度根据其内容自动调整

width: fit-content 是 CSS 中的一个属性值&#xff0c;用于设置元素的宽度根据其内容自动调整&#xff0c;确保宽度刚好容纳内容而不会超出。 效果对比 默认情况&#xff08;width: auto&#xff09;&#xff1a; 块级元素&#xff08;如 <div>&#xff09;会占满父容器…...

Chromium 136 编译指南 Windows篇:depot_tools 配置与源码获取(二)

引言 工欲善其事&#xff0c;必先利其器。在完成了 Visual Studio 2022 和 Windows SDK 的安装后&#xff0c;我们即将接触到 Chromium 开发生态中最核心的工具——depot_tools。这个由 Google 精心打造的工具集&#xff0c;就像是连接开发者与 Chromium 庞大代码库的智能桥梁…...