c – 整数向下转换

关于C中的整数倒数,例如

一个int值000F'E000向下转换为空头或未000F'E000空头将成为E000
short – > -8192
unsigned short – > 57344

它只是简单地削减了比特吗?

而那些上流社会呢? 例如,int -10ffffff81ffffff81转换为long long的规则是什么?


@Update

关于upcasting,根据答案我做了一些测试,发现有2的补码它有以下规则:

    签:
         positive  - > positive:将0添加为前缀位,
        否定 - >否定:添加1作为前缀位,
    签名:
        将0添加为前缀位,

码:

 // integer numbers, downcast & upcast, #include  void downcastTest() { int i = 127<<13; printf("%X, %hX, %hi\n", i, i, i); } void upcastTest() { int i = 127; int j = -127; printf("%x, %llx\n", i, (long long)i); printf("%x, %llx\n", j, (long long)j); } int main(int argc, char * argv[]) { downcastTest(); upcastTest(); return 0; } 

向下转型

对较小的整数类型进行强制转换会丢弃目标类型中不存在的最重要(最左边,因为您在纸上写入完整的二进制整数)。

Upcasts

向上转换为更大的整数更复杂:

  • 对于无符号无符号类型,它会添加足够的零最高有效字节; 这总是保留价值。
  • 对于有符号 签名类型,它对源类型进行符号扩展(即将新字节打包,其位数等于有符号字节); 这总是保留价值,正面或负面
  • 对于无符号到有符号类型,它有效地添加了足够的零最高有效字节; 这总是保留了价值,因为在向上转换的本质中,目的地总是有更多的位,所以总有空间可以增加额外的符号“位”
  • 对于有符号的无符号类型,它会进行符号扩展,然后进行转换; 这不能总是保留该值,因为无法表示负值。

Downcast削减了比特,上传取决于“签名”。 无符号类型的向上转换为该值添加零位,在有符号类型上向上转换复制符号位。 这样,表达式在向上转换之前和之后具有相同的值。

为了将任何东西转换为无符号类型, TYPE_MAX+1为模进行调整,直到它在无符号类型的范围内。 示例: -10转换为uint16_t ,其范围为0-65535,结果为65536-1065526

用于将任何内容转换为带符号的类型:如果原始值在签名类型的范围内,则结果为。 否则,行为是实现定义的 ,其中包括发出信号的可能性。 编译器必须记录此情况的行为。

示例: -10转换为long long结果, long long值为-10 。 位表示无关紧要,规则基于值。


由于在printf使用了错误的格式说明符,您的测试程序包含许多未定义的行为。 (事实上​​,每个格式说明符对于给出的参数都是错误的)。 作为未定义的行为,输出是没有意义的,所以不要尝试从这个程序“学习”。 相反,您可以在本网站上的标准或其他答案中学习规则,并阅读编译器的文档。