[英]How to check if a data type is at maximum capacity?
這是一個兩部分的問題。
我有一個加數字的小代碼; 但是,數字增長的速度往往快於long long
保持的速度。
所以我想我要上一堂課來把它移開。
我的思考過程被賦予3 long long a, b, c;
,
將所有內容加到c
,當c
達到容量時,將b
加1並將c
設置為零。 一旦b
“滿”,則將b
加到a
並將b
和c
設置為零,依此類推。
因此,我必須在重置c
並將其添加到b
之前檢查c
是否滿足容量要求!
有沒有辦法檢查?
有人可以指出我正確的方向來制作我自己的數據類型。 在視覺上,我像上面一樣將3個long long
放在一起,並且數據類型將完成我上面所說的。
最后,我想像對待int一樣對待我的新數據類型:
int a = 0;
我想能夠做
mydatatype a = 0;
英語不是我的母語。
頭文件<limits.h>
定義了:
LLONG_MAX
—可以存儲在(帶符號) long long
的最大值。 最小可接受值為+9223372036854775807(2 63 -1)。 ULLONG_MAX
—可以存儲在unsigned long long
中的unsigned long long
。 它的最小可接受值為18446744073709551615(2 64 -1)。 您可以通過將其與這些值中的適當值進行比較來測試您的數字是否已達到這些限制。
測試整數是否達到最大容量意味着代碼效率很低。 例如,要添加123,您需要進行123增量和123比較。
更好的方法是在執行操作之前確定操作是否會溢出。 例如(僅適用於無符號整數):
if(sum <= ULLONG_MAX - a) {
sum += a;
} else {
/* It would have overflowed */
}
這是因為ULLONG_MAX - a
不會溢出。 當您開始查看有符號整數時,這將成為一個更大的問題,因為LLONG_MAX - a
可能溢出(如果a
為負),而LLONG_MIN - a
也會溢出(如果a
為正)。 您需要同時測試兩種方式:
if( ( a > 0) && (sum <= LLONG_MAX - a) {
sum += a;
} else if( ( a < 0) && (sum >= LLONG_MIN - a) {
sum += a;
} else if( a != 0) {
/* It would have overflowed */
}
一旦確定是否溢出,就需要處理這種情況。 例如; 如果您使用多個整數表示一個更大的整數; 然后(對於無符號整數):
if(sum_low <= ULLONG_MAX - a) {
sum_low += a;
} else {
sum_low -= (ULLONG_MAX - a) + 1;
sum_high++;
}
請注意,在處理原始(避免的)溢出所涉及的臨時計算中,您必須非常小心以避免意外溢出。
如果使用多個有符號整數表示一個更大的有符號整數,則溢出處理背后的邏輯會變得復雜且容易出錯。 理論上是可能的; 但是,最好將數字的符號分開,然后對無符號整數進行運算(或反運算(例如,減去一個正數而不是加一個負數)); 特別是如果您需要使用3個或更多整數表示一個大整數,或者需要更復雜的運算(例如乘法和除法)時,尤其如此。
當然,一旦您走了這條路,就可以有效地實現自己的“大數目”代碼,並且可能應該查找/使用合適的庫。
最后,如果您mydatatype a = 0;
對待原始數據類型一樣對待新的數據類型(例如,並能夠執行mydatatype a = 0;
類的事情),那么您就不走運了-C無法以這種方式工作。 本質上,C很漂亮,因為它不允許試圖閱讀/理解代碼的人隱藏復雜的事物; 如果您想向毫無戒心的受害者隱藏重要信息,則必須使用不太漂亮的語言,例如C ++。 ;-)
如果您正在談論帶符號的數字,則可以通過執行以下操作來判斷數字是否處於“容量”中:
if (c > 0 && c + x < 0)
對於無符號數字,它將類似於:
if (c + x < c)
在這兩種情況下,您只需要檢查溢出即可。 這樣做之后,如果有溢出,那么你加1, b
,把剩余的( MAX_LONG_LONG - c
)回c
。 因此,從b
到a
的過渡。
我不能想到一種簡單的方法,而不僅僅是創建自己的結構並在這些結構周圍編寫add
和subtract
作為函數。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.