读完后64 位上的 32 位无符号乘法会导致未定义的行为吗? https://stackoverflow.com/q/27001604/1806289在 StackOverflow 上的问题中,我开始思考小型无符号类型上的典型算术运算是否会导致根据 C99 标准的未定义行为。
例如,采用以下代码:
#include <limits.h>
...
unsigned char x = UCHAR_MAX;
unsigned char y = x + 1;
The x
变量被初始化为最大幅度unsigned char
数据类型。下一行是问题:值x + 1
大于UCHAR_MAX
并且不能存储在unsigned char
多变的y
.
我相信以下是实际发生的情况。
- 变量
x
首先提升为数据类型int
(部分6.3.1.1/2), then x + 1
被评估为数据类型int
.
假设有一个实现,其中INT_MAX
and UCHAR_MAX
是相同的 -x + 1
将导致有符号整数溢出。这是否意味着增加变量x
尽管是无符号整数类型,但可能会由于可能的有符号整数溢出而导致未定义的行为?
根据我对标准的阅读,使用 15 位的实现char
可以合法储存int
作为 15 位大小,并使用第二个 15 位字来存储符号以及 14 位填充;在这种情况下,一个unsigned char
将保存值 0 到 32,767 和int
将保存从 -32,767 到 +32,767 的值。加 1 到(unsigned char)32767
确实是未定义的行为。任何更大的情况都可能出现类似的情况char
如果 32,767 替换为UCHAR_MAX
.
然而,与另一篇文章中提到的与无符号整数乘法相关的现实问题相比,这种情况不太可能发生。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)