c - 为什么 (-1)%(unsigned int) 不同于 (-1)%(int) +(它用 uint 计算什么并且转换为 int 是一个很好的解决方案)

标签 c modulo

<分区>

#include <stdio.h>
int main()
{
    unsigned int a=10;
    int b=10;
    int c=-1;
    printf("%d %d %d",(c%a),(c%(int)a),(c%b));
    return 0;
}

输出“5 -1 -1”(使用 https://www.onlinegdb.com/ )。到达5是在计算什么?只要 unsigned int 适合 int,是否只是将其转换为 int 的正确修复?

最佳答案

C 的所有算术运算符(<<>> 除外,它们仅对第一个操作数执行此操作)在执行操作之前根据语言的类型提升规则将两个操作数提升为通用类型。推广c (值为 -1)到 unsigned执行模块化归约,模一加上类型中可表示的最大值,即一加 UINT_MAX . -1 用“一加”抵消,结果是 UINT_MAX ,通常为 4294967295。然后 4294967295U % 10U当然是 5。

关于c - 为什么 (-1)%(unsigned int) 不同于 (-1)%(int) +(它用 uint 计算什么并且转换为 int 是一个很好的解决方案),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58289904/

相关文章:

c++ - 获取数字小数部分的最佳方法

c - 程序有时会出现段错误,但并非总是如此。我该如何纠正它?

c - 数组输出指针

java - 一些 Java 模/余数运算符问题

javascript - 尝试用 JS 编写这个 Excel 函数,但在模数部分上遇到困难

data-structures - 哈希表是如何工作的?

haskell - 返回一个列表,其中包含一对元素,但前提是各个元素的总和是奇数

c - gcc 警告 : incompatible pointer type

c - C 中的 R 包依赖于另一个 R 包

c - 在 C 中创建新 block 时缩进新行