【发布时间】:2019-01-29 12:18:34
【问题描述】:
我在 C 中有一个类似这样的代码:
int main(){
unsigned char var1;
var1 = 255;
var1 = var1 + 1;
printf("The result is = %i", var1);
}
我认为它会溢出,因为 var1 的最大类型高达 255,所以当你将它增加到 1 时,它将是 256,但结果是 0。
但是当我像这样修改代码时:
int main(){
unsigned char var1;
var1 = 255+ 1;
printf("The result is = %i", var1);
}
结果给出了一个溢出错误,例如“警告:从 'int' 到 'unsigned char' 的无符号转换将值从 '256' 更改为 '0' [-Woverflow]”。
为什么第一个代码没有溢出?
【问题讨论】:
-
如果打印 0 则第一个示例 确实 溢出。这就是无符号整数变量溢出时会发生的情况:它回绕到 0。您是在问为什么没有编译器警告吗?答案很简单:溢出不是在编译时,而是在运行时。 (无论如何,运行时溢出是明确定义的,而且通常是故意的。这不是错误。编译时溢出通常是。)
-
两个代码的效果相同,编译器在决定何时显示警告时并不是很准确。
-
详情:这里没有没有溢出。
var1 + 1和255+ 1都不会溢出。int溢出是 UB。而是从int到unsigned char的转换。这是很好的定义。整数溢出与转换问题有一些相似之处,但 C 对它们的指定不同。 -
@chux AFAIK,
unsigned(OP 使用)溢出在 C 中定义良好。当然,同意我们这里没有溢出,但可以通过var1 = var1 + (unsigned char)1;引入。 -
@GermanNerd
var1 + (unsigned char)1在var1是 8 位unsigned char时不能溢出。在添加之前,两者都被认为是通常的算术转换,并成为int,它至少是 16 位的。然后总和在范围内:没有溢出。如果总和超过 255,则对unsigned char的 assignment 会导致减少,但又一次,这不是 C 中的 overflow。
标签: c