![]() |
1
4
如您所料,以下操作数
执行时
常用的算术转换
对于A
转换
|
![]() |
2
1
C中的算术在很大程度上遵循了处理器中可用的算术。处理器通常有处理相同格式数字的指令。例如,可能有一条指令用于将两个8位有符号整数相加,另一条指令是将两个16位有符号数字相加,还有一条指令可以将两个32位有符号的整数相加,以及类似的乘法、除法和比较数字的指令。(有时这些指令利用数学特性,使一条指令可以服务于多个目的。例如,通过添加两个32位数字,可以添加两个8位数字,但忽略前24位。但这是另一个话题。) 处理器通常没有将32位无符号整数与8位有符号整数进行比较的指令。添加这样的指令需要向处理器添加更多的线路和开关,对于很少使用的操作来说,这是不值得的。如果没有具体的指令,C可以提供比较操作,但它必须使用多条指令。我们可以通过将八位整数与零进行比较来实现。如果它小于零,它也小于无符号整数。否则,我们可以将8位整数转换为32位无符号整数(只需将其放入更大的寄存器中,将高24位设置为零),并使用该指令比较两个32位无信号整数。 但这比大多数比较都要费力。C在很大程度上是为了促进和鼓励高效的代码。C表达式中的算术转换规则是为典型处理器设计的。想要以不同方式计算表达式的程序员需要为此编写自己的代码。
为了说明,我假设你的C实现使用32位
添加22B8 16 以及FFFFFFF 16 数学上是1000022B7 16 ,但那是33位。无符号整数算术也被定义为换行,因此2 32 位被消除,结果为000022B7 16 = 8887. |
![]() |
3
1
是的,这是对通常算术转换的合理(尽管粗略)总结。C不会对小于以下值的类型执行任何整数运算
关系运算符的操作数需要进行通常的算术转换。您的特定操作数具有类型
是的,转换后的操作数的真实算术和大于类型可表示的最大值
*
从技术上讲,
整数转换等级低于
|
![]() |
MaPo · Linux,设置锁定ICMP_过滤器选项 5 月前 |
![]() |
Doohyeon Won · 内联函数上的奇怪现象?[关闭] 6 月前 |
![]() |
Bobby · 复合字面值总是左值吗? 6 月前 |
![]() |
9-Pin · C: 嵌套结构的堆栈内存分配 6 月前 |