从unsigned long long转换为unsigned int

时间:2016-08-14 09:16:12

标签: c type-conversion

我正在寻找一个小小的试图找到答案,但我无法找到明确的答案。
我看到this回答他写的旁注:

  

无符号类型的规则不同;转换的结果   无符号类型的有符号或无符号整数定义良好。

那么明确定义的行为是什么?
unsigned long long转换为unsigned int时是否存在已定义的行为?它只是切断了32个MSB的? (留给我的是32 LSB') 假设我的系统中sizeof(unsigned int)4sizeof(unsigned long long)8
在没有强制转换的情况下分配时以及在使用强制转换进行分配时是否存在不同的行为?

1 个答案:

答案 0 :(得分:4)

标准说:

  

6.3.1.3有符号和无符号整数
  1当具有整数类型的值转换为除_Bool以外的另一个整数类型时,如果该值   可以用新类型表示,它没有变化   2否则,如果   新类型是无符号的,通过重复添加来转换该值   或减去一个可以表示的最大值   在新类型中,直到值在新类型的范围内。 49)
  3   否则,新类型将被签名,并且无法表示该值   在里面;结果是实现定义的还是   实现定义的信号被提出。

第2点描述了模运算,与在这种情况下切断MSB具有相同的效果。 (当新类型的最大值加1是数字基数的幂时,它具有相同的效果。)

如果你使用铸造没有区别。