C语言 当我们超出Int8_t的范围值时会发生什么

dced5bon  于 2023-01-16  发布在  其他
关注(0)|答案(1)|浏览(399)

我希望你能帮我解决这个问题,x的最终值是多少?

int32_t x = 0xE5;
int8_t i;

for(i=0;i<200;i++)
{
x++;
}`

当int8_t超出其范围-128至127时,它会发生什么变化?
谢谢

mhd8tkvw

mhd8tkvw1#

考虑一下i为127时i++中会发生什么。C标准的后缀++规范在C 2018 www.example.com 2中指出6.5.2.4:
...作为副作用,操作数对象的值递增(即,将适当类型的值1加到它上面)...
不幸的是,它没有说明其他关于所使用的算术;它没有说明加法是使用int8_t算法还是int算法或其他方法执行的。在C语言的大多数运算中,操作数至少升级为int类型。例如,i += 1被指定为有效地等效于i = i + 1,并且指定i + 1以将该i提升为int。则加法得到128,因为127 + 1 = 128,而128可以用int类型表示,那么128就被转换成int8_t存储在i中。这是一个问题,因为128在int8_t中是不可表示的。C 20186.3.1.33表示存在实现定义的结果或实现定义的信号。
这意味着你的编译器必须记录下这里发生的事情。应该有一个编译器手册,它应该说明当一个超出范围的结果被转换成int8_t时会发生什么。例如,GCC记录下结果以256为模 Package 。
由于标准对所使用的算术比较模糊,所以有可能其意图是算术将在int8_t类型中执行,并且加法将溢出,这具有未定义的行为,但是这将与标准的一般性质形成对比。
如果循环继续,那么x++最终将超过int32_t类型。如果int32_t类型与int类型相同,则它将溢出并具有未定义的行为。如果intint32_t宽,则我们具有相同的情况,即成功的加法之后是实现定义的转换。

相关问题