C 从无符号长整型转换为无符号整型

C 从无符号长整型转换为无符号整型,c,type-conversion,C,Type Conversion,我四处搜索,试图找到答案,但找不到明确的答案。 我看到了答案,他在旁边写道: 无符号类型的规则不同;转换一个文件的结果 无符号类型的有符号或无符号整数定义良好 那么什么是定义明确的行为呢? 从unsigned long long转换为unsigned int时是否定义了行为?它只是切断了32个MSB吗?(留给我的是32个LSB)。 让我们假设sizeof(unsigned int)在我的系统中是4,sizeof(unsigned long)在我的系统中是8。 在不使用强制类型分配和使用强制类型分

我四处搜索,试图找到答案,但找不到明确的答案。
我看到了答案,他在旁边写道:

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

那么什么是定义明确的行为呢?
unsigned long long
转换为
unsigned int
时是否定义了行为?它只是切断了32个MSB吗?(留给我的是32个LSB)。
让我们假设
sizeof(unsigned int)
在我的系统中是
4
sizeof(unsigned long)
在我的系统中是
8

在不使用强制类型分配和使用强制类型分配时,是否有不同的行为?

标准规定:

6.3.1.3有符号和无符号整数 1当整数类型的值转换为除
\u Bool
以外的其他整数类型时,如果 可以用新类型表示,但它没有更改。
2否则,如果 新类型是无符号的,通过重复添加来转换该值 或者减去比可以表示的最大值多一个值 在新类型中,直到值在新类型的范围内。49)
3. 否则,将对新类型进行签名,并且无法表示该值 在它里面;结果要么是定义了实现,要么是 引发实现定义的信号

第2点描述了模运算,其效果与在本例中切断MSB的效果相同。(当新类型的最大值加上1是基数的幂时,效果相同。)


如果您使用铸造,没有什么区别。

感谢您引用标准并回答我的具体案例。