Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 为什么无符号整数变量通常不受整数提升的影响?_C_Promotions - Fatal编程技术网

C 为什么无符号整数变量通常不受整数提升的影响?

C 为什么无符号整数变量通常不受整数提升的影响?,c,promotions,C,Promotions,在阅读了大量关于整数提升的问题后,似乎大家都认为整数提升或仅适用于小整数类型,例如short int或char 然而,我想知道为什么I的无符号int变量。E值15也不应提升为int。毕竟,它的转换秩等于int和unsigned int的秩,正如下面引用的语句(1)所要求的那样 由于int可以毫无问题地表示15的值(在我所知道的所有平台上),因此应该将其转换为int 在表达式中使用int或unsigned时,可以使用以下内容 int可用于: 具有整数类型且其整数转换秩小于或等于的对象或表达式 整

在阅读了大量关于整数提升的问题后,似乎大家都认为整数提升或仅适用于小整数类型,例如
short int
char

然而,我想知道为什么I的
无符号int
变量。E值
15
也不应提升为
int
。毕竟,它的转换秩等于int和unsigned int的秩,正如下面引用的语句(1)所要求的那样

由于
int
可以毫无问题地表示
15
的值(在我所知道的所有平台上),因此应该将其转换为int

在表达式中使用int或unsigned时,可以使用以下内容 int可用于:

  • 具有整数类型且其整数转换秩小于或等于的对象或表达式 整数和无符号整数的秩

  • 类型为_Bool、int、signed int或unsigned int的位字段

  • 如果int可以表示原始类型的所有值(受限 根据宽度(对于位字段),将值转换为int; 否则,它将转换为无符号整数 整数促销。所有其他类型均由整数保持不变 晋升

    然而,我想知道为什么I的无符号int变量。E值
    15
    也不应提升为
    int
    。[…]一个
    int
    可以毫无问题地表示
    15
    的值

    这种说法有两个问题:

    • 整数升级并不意味着“升级到
      int
      ”;它的意思是“升级到
      int
      无符号int
      ”。因此,“提升”一个
      无符号int
      没有意义:它已经被提升了
    • 整数提升规则不考虑表达式的当前值。这些规则是以一种特定的方式编写的,用于讨论某一类型的所有值。因此,
      int
      能够表示值
      15
      的事实是不相关的,因为
      int
      不能表示
      无符号int
      的所有值

    通常,不可能在编译时说出实际发生升级时变量将包含哪些值

    调查变量的值以在运行时选择适当的类型会带来太多的开销,而且根本不可能。所以,编译器只有类型


    我认为选择无符号类型而不是有符号类型的主要原因是定义了无符号整数溢出,而有符号整数的溢出是未定义的行为。

    With
    unsigned a=1;长b=2;b=a+b
    a
    在添加之前被提升为
    long
    。我不清楚你在问什么,你是在问一个理由,还是在问为什么措辞不允许这样做?这可能与你的问题有关:这是否会对你有所帮助?我还不确定我是否应该将此标记为可接受的答案。虽然第二条在我所知道的所有平台上都是绝对正确的,但第一条对我来说还不令人满意。我同意你的观点,“提升”一个
    无符号int
    是没有意义的。然而,我发布这个问题的原因是:为什么法律允许将
    unsigned int
    升级为
    int
    ,尽管这没有意义?毕竟,该标准规定:其整数转换秩小于或等于int和unsigned int的秩!我希望你明白我的意思。我不是母语人士,这是一个相当复杂的话题。@Multisync“为什么法律上允许将
    无符号int
    提升为
    int
    ,尽管这没有意义?”法律上不允许:规则说“如果
    int
    可以表示原始类型的所有值,则该值将转换为
    int
    ”。由于
    int
    可以表示
    unsigned int
    的部分(但不是全部)值,因此不考虑此提升,尽管类型具有相同的转换等级(实际上,所有对应的
    X
    (有符号)和
    无符号X
    类型总是有相同的转换等级)。嗯……好吧。我还是不明白他们为什么把“或”放在相等的位置“好了。如果我对秩模式的理解是正确的,那么就不可能有一个秩等于
    无符号int
    int
    的类型,所以把它放进去没有任何意义。