C 溢出的变量的值是多少?

C 溢出的变量的值是多少?,c,C,在上面的操作中,我无法理解溢出是如何发生的,执行后c的值是多少 char c = 250; c + = 8; 当char为8位无符号时,c的值首先为250,然后为250+8-->258。然后将258分配给c,并转换为2,这是由于将超出范围的值分配给无符号char的转换规则 当char为8位有符号时,c将首先具有实现定义的值,这是由于将超出范围的int常量250转换为char,可能是-6。然后是2,因为加了8 根据溢出的定义,没有溢出发生,只是转换涉及到变窄。奇怪的是,标准采取的立场是,在未签名

在上面的操作中,我无法理解溢出是如何发生的,执行后c的值是多少

char c = 250;
c + = 8;
char
为8位无符号时,
c
的值首先为250,然后为250+8-->258。然后将258分配给
c
,并转换为2,这是由于将超出范围的值分配给无符号
char
的转换规则

char
为8位有符号时,
c
将首先具有实现定义的值,这是由于将超出范围的
int
常量250转换为
char
,可能是
-6
。然后是2,因为加了8


根据溢出的定义,没有溢出发生,只是转换涉及到变窄。

奇怪的是,标准采取的立场是,在未签名的情况下也不会发生溢出。根据术语的用法,“溢出”在无符号算术中永远不会发生,因为对无符号操作数的每一次算术运算的结果都定义为结果类型范围内的值(尽管不一定是对整数的相应运算的数学结果).不会因为通常的整数促销而出现溢出。“250+8”不会溢出,因为
int
保证能够表示258。有一个赋值返回到
c
,这就是类似溢出的行为发生的地方(反复加或减
UCHAR_MAX+1
,直到结果在范围内)。@JohnBollinger和Paul Hankin。双方意见一致。答案已修改。这取决于
char
signed
还是
unsigned
char c = 250;
c + = 8;