C 整数提升、值位和乘法

C 整数提升、值位和乘法,c,standards,language-lawyer,integer-overflow,integer-promotion,C,Standards,Language Lawyer,Integer Overflow,Integer Promotion,如果我们将两个uint32\u t类型相乘,并且它们在此系统上键入int,有63个值位和一个符号位,那么这些值将转换为int(整数提升),相乘,并转换回uint32\u t。中间结果不能用int表示:2^32-1*2^32-1>2^63-1,并触发有符号整数溢出,导致未定义的行为 UINT32\u MAX的值为2^32-1,因为UINT32\u t保证有32个值位 uint32_t a = UINT32_MAX ; uint32_t b = UINT32_MAX ; uint32_t c = a

如果我们将两个
uint32\u t
类型相乘,并且它们在此系统上键入
int
,有63个值位和一个符号位,那么这些值将转换为
int
(整数提升),相乘,并转换回
uint32\u t
。中间结果不能用
int
表示:
2^32-1*2^32-1>2^63-1
,并触发有符号整数溢出,导致未定义的行为

UINT32\u MAX
的值为
2^32-1
,因为
UINT32\u t
保证有32个值位

uint32_t a = UINT32_MAX ;
uint32_t b = UINT32_MAX ;
uint32_t c = a*b ;

既然int大小为64位的平台很常见,那么我的结论正确吗?程序员希望结果将换行,因为类型是无符号的,但是整数提升将由于有符号溢出而导致未定义的行为。

如果您有这样一个只有32个值位的模糊64位
int
类型,它仍然具有与uint32\t相同的精度。考虑到6.3.1.1在确定转换秩时似乎只关心精度,我认为64位
int
,与
uint32\u t
具有相同的值位数,不能被视为具有更高的转换秩。因此,不应进行整数升级


当然,无论是否有整数提升,您仍然会得到溢出,因为
UINT32\u MAX*2
不能放入UINT32\u t,也不能放入特殊的64位带32位值的
int

@LPs中。显然,这是不正确的。未签名不能溢出。例如,在平台上,uint32\u t将不会转换为int,并且保持无符号。但这不是我的问题。第一部分是真的吗
UINT32_MAX*UINT32_MAX
将设置最高位(它是fffffff e0000001),如果您有64位整数,这是不允许的,是吗?@harold Yes它将使整数溢出,即使整数有63位值。好的,这样做会更容易。所以在这种情况下,请看:@harold是的,这是非常狡猾的行为。没有int被定义为总共有64位和31个填充位。我想我已经清楚地说明了:32个值位、一个符号位和31个填充位。具有32个值位的整数可以表示uint32\u t的所有值,因为uint32\u t正好有32个值位。@reader啊,误读了该部分。让我更新答案。对不起,我已经编辑了这个问题。@reader对你很好,谢谢你浪费我的时间。再见,什么?你不是在帮助别人吗?是的,你没有得到分数,但你确实帮助了别人。所以对你来说只有分数重要?