C 4位无符号溢出

C 4位无符号溢出,c,C,是否保证在任何平台上,此代码打印的值始终在0到15之间 #include <stdio.h> typedef struct UI4{ unsigned value: 4; } ui4; int main(void) { ui4 u; u.value = 0; while (1) { printf("%u\n", u.value++); } return 0; } #包括 类型定义结构UI4{ 无符号值:4; }u

是否保证在任何平台上,此代码打印的值始终在0到15之间

#include <stdio.h>

typedef struct UI4{
    unsigned value: 4;
} ui4;

int main(void)
{
    ui4 u;

    u.value = 0;
    while (1) {
        printf("%u\n", u.value++);
    }
    return 0;
}
#包括
类型定义结构UI4{
无符号值:4;
}ui4;
内部主(空)
{
UI4U;
u、 数值=0;
而(1){
printf(“%u\n”,u.value++);
}
返回0;
}

是的,无符号整数溢出由标准保证“环绕”。

是的,无符号整数溢出由标准保证“环绕”。

我认为从理论上讲,在一些非常奇怪的体系结构上可能会产生不同的结果(基于BCD的计算机)?但在这种情况下,它可能不是一个兼容的实现。实际上,你应该得到4位0到15。但我说的是不要故意溢出。

我认为从理论上讲,在一些非常奇怪的架构上可能会产生不同的结果(基于BCD的计算机)?但在这种情况下,它可能不是一个兼容的实现。实际上,你应该得到4位0到15。但是我说不要故意溢出。

根据标准,无符号溢出必须环绕。根据标准,无符号溢出必须环绕。请注意,程序中隐含的加法是有符号加法。如果
4
31
,那么对于普通的32位编译器,程序将是未定义的。请参阅@PascalCuoq我读到,一个操作数是无符号的,另一个是有符号整数的算术运算被视为无符号运算。这不是真的吗?C99的6.3.1.1:2中的“如果一个int可以表示原始类型的所有值,那么该值将转换为int;否则,它将转换为无符号int”这句话通常被解释为在向其添加一个int时,
u.value
被提升为
int
,因此,操作数
u.value
1
都是有符号的。@PascalCuoq奇怪。确切地说,我在一份文件中读到了这一点,其中也提到了该标准,并说明了完全相反的情况。我也有过意外地做这种算术并得到无符号值的经验。在
ui*ui
中,
si*si
是无符号整数乘积,
u.value*u.value
产生与
si*si
相同的结果。请注意,6.3.1.1:2更改的结果是
无符号值:32
。请注意,程序中隐含的加法是有符号加法。如果
4
31
,那么对于普通的32位编译器,程序将是未定义的。请参阅@PascalCuoq我读到,一个操作数是无符号的,另一个是有符号整数的算术运算被视为无符号运算。这不是真的吗?C99的6.3.1.1:2中的“如果一个int可以表示原始类型的所有值,那么该值将转换为int;否则,它将转换为无符号int”这句话通常被解释为在向其添加一个int时,
u.value
被提升为
int
,因此,操作数
u.value
1
都是有符号的。@PascalCuoq奇怪。确切地说,我在一份文件中读到了这一点,其中也提到了该标准,并说明了完全相反的情况。我也有过意外地做这种算术并得到无符号值的经验。在
ui*ui
中,
si*si
是无符号整数乘积,
u.value*u.value
产生与
si*si
相同的结果。请注意,6.3.1.1:2对
无符号值32的影响有所改变。