我希望你能帮我解决这个问题,x的最终值是多少?
int32_t x = 0xE5; int8_t i; for(i=0;i<200;i++) { x++; }`
当int8_t超出其范围-128至127时,它会发生什么变化?谢谢
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类型相同,则它将溢出并具有未定义的行为。如果int比int32_t宽,则我们具有相同的情况,即成功的加法之后是实现定义的转换。
i
i++
++
int8_t
int
i += 1
i = i + 1
i + 1
x++
int32_t
1条答案
按热度按时间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
类型相同,则它将溢出并具有未定义的行为。如果int
比int32_t
宽,则我们具有相同的情况,即成功的加法之后是实现定义的转换。