C 中运算注意的地方

本文探讨了C语言中移位运算的特点及限制条件,并介绍了如何使用双符号位法来判断整数运算是否发生溢出。此外,还讨论了无符号整数减法的实现方式。

对于c中的移位运算会有移位的限制,即移位位数要小于移位数据类型的字节数。对于int类型0x01左移31位为0x80000000,当左移32位时,为0x01。即当进行移位时,当移位的位数大于31位时,会先与0x31与运算,计算出移位的位数,在进行移位操作。

 

判断溢出的方法: 双符号位法

 

符号位设置为两位,00(或11)当运算结束后,符号位相同则没有溢出,符号位不同说明有溢出。

 

无符号码的减法可以直接是相减,判断是否借位,不用转换为补码的运算。计算机怎么来,就不知道了,估计是转换为补码运算。

 

 

<think>好的,我现在需要回答用户关于C语言中或运算的问题。首先,我得确认用户所说的“或运算”指的是按或还是逻辑或,因为在C语言中两者都有,但符号和用途不同。用户可能对这两个概念有混淆,所以应该都解释清楚。 首先,按运算符是|,而逻辑或运算符是||。这两个运算符的区别在于操作对象和运算方式。按或是对两个整数的每一进行或操作,结果为1只要有一是1;而逻辑或则是判断两个表达式是否为真,只要有一个为真,结果就为真,即1。 接下来,我需要分别给出两个例子来说明它们的用法。比如按或的例子,可以用两个二进制数,比如5(0101)和3(0011),进行按运算,结果应该是7(0111)。这可以通过具体的代码示例来展示,比如int result = 5 | 3;,然后输出结果。 然后是逻辑或的例子,比如判断一个数是否小于0或大于100,这时候用逻辑或,例如if (num < 0 || num > 100)。如果num是-5或者150,条件就会成立。这时候需要解释||在条件判断中的作用,以及短路求值的特性,即如果第一个条件为真,就不会执行第二个条件。 此外,要注意提醒用户不要混淆这两个运算符,因为错误使用可能导致逻辑错误。比如,如果在应该用逻辑或的地方用了按或,可能会得到不正确的结果,尤其是在处理非布尔值时。 最后,总结一下两者的区别和应用场景,按或用于操作,逻辑或用于条件判断。确保用户能够明确区分两者的使用方式和场合。</think>在C语言中,**或运算**分为两种形式:按运算符 `|` 和逻辑或运算符 `||`。它们的含义和使用场景不同,具体如下: --- ### 一、按运算符 `|` **作用**:对两个整数的二进制每一进行“或”操作 **规则**:两中只要有一是`1`,结果为`1`;两都是`0`时结果才为`0`。 #### 示例: ```c int a = 5; // 二进制 0101 int b = 3; // 二进制 0011 int c = a | b; // 按运算 // 计算过程: // 0101 (5) // | 0011 (3) // = 0111 (7) printf("%d", c); // 输出 7 ``` **典型用途**:合并标志、设置特定为1。 例如设置文件权限:`read | write | execute`。 --- ### 二、逻辑或运算符 `||` **作用**:判断两个表达式是否至少有一个为真(非零值即为真) **规则**:若任意一个操作数为真(非零),结果为`1`(真);只有两者都为假(零)时结果才为`0`(假)。 #### 示例: ```c int age = 25; if (age < 18 || age > 60) { printf("不符合工作年龄要求"); } else { printf("符合要求"); } // 输出:"符合要求" ``` **特性**:短路求值。若第一个表达式为真,直接跳过第二个表达式的计算。 例如:`if (ptr != NULL || ptr->value > 0)` 中,若 `ptr` 为 `NULL`,不会执行 `ptr->value`,避免崩溃。 --- ### 三、关键区别 | 特性 | `|`(按或) | `||`(逻辑或) | |------------|-----------------------|------------------------| | 操作对象 | 整数(二进制操作) | 表达式(真/假判断) | | 结果类型 | 整数 | `1`(真)或 `0`(假) | | 短路求值 | 无 | 有 | --- ### 四、常见错误 ```c // 错误示例:混淆 | 和 || int x = 5, y = 0; if (x | y) { // 实际等价于 if(5 | 0) → if(5),永远为真 printf("执行"); } ``` **总结**: - 需要操作时用 `|` - 需要条件判断时用 `||`
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值