[英]Integer arithmetic overflow prevention in C
我認為以下代碼可能會導致溢出,因為a * 65535
大於unsigned short int
可以容納的值,但結果似乎是正確的。
C 中是否有一些內置機制將中間算術結果存儲在更大的數據類型中? 或者它是一個意外?
unsigned char a = 30;
unsigned short int b = a * 65535 /100;
printf("%hu", b);
它之所以有效,是因為在默認提升下所有比int
窄的類型都會 go 。 由於unsigned char
和unsigned short
在您的平台上都小於 int,因此它們將被提升為int
並且如果int
包含結果不會溢出22 位或更多(即CHAR_BIT + 17
位或更多位(這是a * 65535
加號的結果),30 * 65535
加號中的位數)。 但是,如果int
的位數較少,則會發生溢出並發生未定義的行為。 如果sizeof(unsigned short) == sizeof(int)
也行不通
默認提升允許更快地完成操作(因為大多數 CPU 在其本機大小的值下工作得最好)並且還可以防止一些幼稚的溢出發生。 看
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.