C++ 隐式字符转换

C++ 隐式字符转换,c++,C++,具有以下代码: unsigned char c1 = -55; 1)会发生什么?c1变量是否隐式转换为unsigned int,或者unsigned是否被忽略且c1仍保持signed int 2.)为什么这两种说法都是: if (c1 != -55) printf("!="); 及 打印= 以上都没有c1具有类型无符号字符;等号右边的任何东西都不能改变这一点。价值−55(其类型为int)通过赋值转换为无符号字符,就像向其添加256一样,因此c1被初始化为201.1。您可以通过编写

具有以下代码:

unsigned char c1 = -55;
1)会发生什么?
c1
变量是否隐式转换为
unsigned int
,或者
unsigned
是否被忽略且
c1
仍保持
signed int

2.)为什么这两种说法都是:

if (c1 != -55)  
    printf("!=");

打印
=

  • 以上都没有
    c1
    具有类型
    无符号字符
    ;等号右边的任何东西都不能改变这一点。价值−55(其类型为
    int
    )通过赋值转换为
    无符号字符
    ,就像向其添加256一样,因此
    c1
    被初始化为201.1。您可以通过编写

    printf("%u\n", c1);
    
    初始化之后

  • 这两个比较首先将
    c1
    转换回
    int
    。201可在
    int
    中表示,因此该值不会更改。201不等于55,也不等于−五十五


  • 1从技术上讲,增加的价值是
    UCHAR_MAX+1
    ,但这是非常非常罕见的,除了256。标准中详细说明了将负数从有符号转换为无符号的效果

  • 以上都没有
    c1
    具有类型
    无符号字符
    ;等号右边的任何东西都不能改变这一点。价值−55(其类型为
    int
    )通过赋值转换为
    无符号字符
    ,就像向其添加256一样,因此
    c1
    被初始化为201.1。您可以通过编写

    printf("%u\n", c1);
    
    初始化之后

  • 这两个比较首先将
    c1
    转换回
    int
    。201可在
    int
    中表示,因此该值不会更改。201不等于55,也不等于−五十五



  • 1从技术上讲,增加的价值是
    UCHAR_MAX+1
    ,但这是非常非常罕见的,除了256。标准中详细说明了将负数从有符号转换为无符号的效果。

    请告诉我为什么我的问题被否决了?我没有否决你,但这是一个非常基本的问题,其中包含一些基本的困惑;你可能会更好地通过C++教科书,或几个,然后再问更多问题。请你告诉我为什么我的问题被否决了?我没有投票给你,但这是一个非常基本的问题,其中包含一些基本的混乱;你可能会更好地通过C++教科书或几个问题,然后再问更多的问题。几个问题:1)你在1的答案中提到了什么类型的转换?(SM、U1、U2)?2.)关于答案#2-为什么从无符号字符转换为int,而不是相反(从int转换为无符号字符)?如果我是对的,那是因为转换总是试图作为一种提升——从较窄的数据类型到较宽的数据类型以避免数据丢失?@Mulligun81(1)我不知道你所说的SM、U1或U2是什么意思。(2) 注释框中不包含完整的解释。当你在C语言中做算术时,总会有一组这样的情况发生。它们总是在扩大转换,其基本原理是尽可能保留值,但它们的行为仍然可能令人惊讶,因此你需要知道并理解实际规则。几个问题:1)你在#1答案中提到的转换类型是什么?(SM、U1、U2)?2.)关于答案#2-为什么从无符号字符转换为int,而不是相反(从int转换为无符号字符)?如果我是对的,那是因为转换总是试图作为一种提升——从较窄的数据类型到较宽的数据类型以避免数据丢失?@Mulligun81(1)我不知道你所说的SM、U1或U2是什么意思。(2) 注释框中不包含完整的解释。当你在C语言中做算术时,总会有一系列的情况发生。它们总是在扩大转换,其基本原理是尽可能地保留值,但它们的行为仍然会令人惊讶,因此你需要知道并理解实际的规则。