簡體   English   中英

C 中的 Integer 算術溢出預防

[英]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 charunsigned short在您的平台上都小於 int,因此它們將被提升為int並且如果int包含CHAR_BIT + 17位或更多位(這是a * 65535加號的結果),結果不會溢出22 位或更多(即30 * 65535加號中的位數)。 但是,如果int的位數較少,則會發生溢出並發生未定義的行為。 如果sizeof(unsigned short) == sizeof(int)也行不通

默認提升允許更快地完成操作(因為大多數 CPU 在其本機大小的值下工作得最好)並且還可以防止一些幼稚的溢出發生。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM