c – 整数向下转换
关于C中的整数倒数,例如
一个int值000F'E000
向下转换为空头或未000F'E000
空头将成为E000
。
short
– > -8192
,
unsigned short
– > 57344
,
它只是简单地削减了比特吗?
而那些上流社会呢? 例如,int -10
是ffffff81
, ffffff81
转换为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-10
或65526
。
用于将任何内容转换为带符号的类型:如果原始值在签名类型的范围内,则结果为。 否则,行为是实现定义的 ,其中包括发出信号的可能性。 编译器必须记录此情况的行为。
示例: -10
转换为long long
结果, long long
值为-10
。 位表示无关紧要,规则基于值。
由于在printf
使用了错误的格式说明符,您的测试程序包含许多未定义的行为。 (事实上,每个格式说明符对于给出的参数都是错误的)。 作为未定义的行为,输出是没有意义的,所以不要尝试从这个程序“学习”。 相反,您可以在本网站上的标准或其他答案中学习规则,并阅读编译器的文档。