user-0 提问: 警告处理

回复:
user: user-1
content: 引用 13 楼 赵4老师 的回复:被鄙视相对被无视还是要好很多。我的阿Q精神胜利法又奏效了。 赵4老湿，你个糟老头子，坏得很。朕要忙去了，过半个月再来看你们都咧咧啥了。

user: user-2
content: 被鄙视相对被无视还是要好很多。我的阿Q精神胜利法又奏效了。

user: user-1
content: 引用 9 楼 赵4老师 的回复:我要说的话别人都替我说完了。 “别人”？太不礼貌了。赵4，还老湿呢，朕鄙视你。

user: user-0
content: 引用 8 楼 均陵鼠侠的回复:[quote=引用 5 楼 佛系咸鱼en 的回复:][quote=引用 楼主 佛系咸鱼en的回复:]出现这个警告该如何处理，求指点 for (int j = 0; j < 20; ++j)  		{ 			if (d[i] == j) 			{ 				k[i] = j; 				break; 			} 			else if (d[i] > j && d[i] < j + 1) //其中数组d为double在j+1处有误 			{ 				k[i] = j + 1; 				break; 			}  		}[/quote]  窝哈哈哈，原来如此。赵4老湿将会告诉你，对于表达式 d [i] < j + 1 来说，依据常规算术转换（Usual arithmetic conversions）的规则，要先计算子表达式 d [i] 和 j + 1 的值，再将这两个值转换为相同的类型，然后进行比较。  子表达式 d [i] 的结果类型是 double，先按下不表；  在子表达式 j + 1 中，子表达式 j 的类型是 int ，常量 1 的类型也是 int，相加后的结果类型是 int。  如此一来，需要将子表达式 j + 1 的结果从它原来的 int 类型转换为 double 类型。  但是，在计算子表达式 j + 1 的时候，如果 j 的值是 int 类型的最大值，则这个计算可能会溢出。在这种情况下，编译器就可能会倾向于认为，既然表达式 j + 1 的结果迟早要转换为 double ，那么，何不将 j 或者 1 提前转换为 double 呢？这样就可以避免溢出。例如： d [i] < (double) j + 1; 或者 d [i] < j + 1.0; 不管是采用哪一种方式，对于加法运算来说，也是先进行常规算术转换，将两个操作数都转换为 double 类型，于是相加的结果自然是不会溢出的、double 类型的值。[/quote] 太详细了，非常感谢，比心❤️

user: user-0
content: 引用 9 楼 赵4老师的回复:我要说的话别人都替我说完了。 你们两个太好了，感谢，比心❤️

user: user-2
content: 我要说的话别人都替我说完了。

user: user-1
content: 引用 5 楼 佛系咸鱼en 的回复:[quote=引用 楼主 佛系咸鱼en的回复:]出现这个警告该如何处理，求指点 for (int j = 0; j < 20; ++j)  		{ 			if (d[i] == j) 			{ 				k[i] = j; 				break; 			} 			else if (d[i] > j && d[i] < j + 1) //其中数组d为double在j+1处有误 			{ 				k[i] = j + 1; 				break; 			}  		}[/quote]  窝哈哈哈，原来如此。赵4老湿将会告诉你，对于表达式 d [i] < j + 1 来说，依据常规算术转换（Usual arithmetic conversions）的规则，要先计算子表达式 d [i] 和 j + 1 的值，再将这两个值转换为相同的类型，然后进行比较。  子表达式 d [i] 的结果类型是 double，先按下不表；  在子表达式 j + 1 中，子表达式 j 的类型是 int ，常量 1 的类型也是 int，相加后的结果类型是 int。  如此一来，需要将子表达式 j + 1 的结果从它原来的 int 类型转换为 double 类型。  但是，在计算子表达式 j + 1 的时候，如果 j 的值是 int 类型的最大值，则这个计算可能会溢出。在这种情况下，编译器就可能会倾向于认为，既然表达式 j + 1 的结果迟早要转换为 double ，那么，何不将 j 或者 1 提前转换为 double 呢？这样就可以避免溢出。例如： d [i] < (double) j + 1; 或者 d [i] < j + 1.0; 不管是采用哪一种方式，对于加法运算来说，也是先进行常规算术转换，将两个操作数都转换为 double 类型，于是相加的结果自然是不会溢出的、double 类型的值。

user: user-3
content: 警告的内容是让你用4字节存储的数据改成8字节存储，因为已经溢出了。贴代码吧，或许更好的解决问题～

user: user-2
content: short int si; int i; i=(int)si+10000;

user: user-4
content: Warning C26451

user: user-0
content: 引用 1 楼 user-4的回复:Warning C26451 有看过，有点无从下手

user: user-0
content: 引用 4 楼 均陵鼠侠的回复:[quote=引用 2 楼 赵4老师 的回复:]short int si; int i; i=(int)si+10000; 不得了，赵4老湿终于回来了。大家快来看呐，别让他跑了！ short int si; int i; i = (int) si + 10000; 嘻，赵老湿你是认真的吗？ 变量 si 没有初始化或者赋值，而且，10000 是一个整型常量，它的类型是 int。在做这个加法运算时， 要对变量 si 的值做整型提升。提升之后，两个操作数的类型相同，不再进一步转换，直接做加法。  当然，赵老湿说这我知道，我只是做一个例子来说明，不要在意这些细节。不过我有一个更好的例子： char c; int i = 50; c = i + 60ULL; 赵老湿你看，这个例子多明显呐。唉，不过楼主的信息不完整，人家写的也许并不是 C 语言程序。[/quote] 是C语言程序

user: user-0
content: 引用 楼主 佛系咸鱼en的回复:出现这个警告该如何处理，求指点 for (int j = 0; j < 20; ++j)  		{ 			if (d[i] == j) 			{ 				k[i] = j; 				break; 			} 			else if (d[i] > j && d[i] < j + 1) //其中数组d为double在j+1处有误 			{ 				k[i] = j + 1; 				break; 			}  		}

user: user-1
content: 引用 2 楼 赵4老师 的回复:short int si; int i; i=(int)si+10000; 不得了，赵4老湿终于回来了。大家快来看呐，别让他跑了！ short int si; int i; i = (int) si + 10000; 嘻，赵老湿你是认真的吗？ 变量 si 没有初始化或者赋值，而且，10000 是一个整型常量，它的类型是 int。在做这个加法运算时， 要对变量 si 的值做整型提升。提升之后，两个操作数的类型相同，不再进一步转换，直接做加法。  当然，赵老湿说这我知道，我只是做一个例子来说明，不要在意这些细节。不过我有一个更好的例子： char c; int i = 50; c = i + 60ULL; 赵老湿你看，这个例子多明显呐。唉，不过楼主的信息不完整，人家写的也许并不是 C 语言程序。