2012-01-23 58 views
1

我有一塊代碼,我看到一個警告說等效用C模量(算術運算功能)的?

我正在做有符號和無符號數字之間的比較。
喜歡的東西INT < =常數/的sizeof(表達)

什麼是糾正這一點的最好方法是什麼?我相信取有號碼的模數然後做比較吧?我的意思是在sizeof運算符除以表達式後得到無符號數。所以其他的方式可能是讓這個RHS簽署

如果是的話是有C中的函數,它可以讓我做到這一點?我做了一個快速搜索,他們說%的模數顯然不是我正在尋找的。

這是實際的警告

警告:符號和無符號整數表達式之間

比較和這是代碼

泛函的實際線(.... ..,INT NUM,.....){

斷言(NUM < = MAX_SIZE /的sizeof(INT)); //這裏MAX_SIZE是的#define MAX_SIZE 1000

}

+3

如果您在問題中提到了警告和錯誤,您可能需要記下實際的警告,而不是您的近似版本。如果你能讓它伴隨一些相關的代碼,那會更好。 – Bart

+0

添加上面的原始代碼和警告。 – Manish

+0

問題是,'num'可能需要的預期允許範圍是多少?與尺寸相關的表達式讓我確實想知道使用模運算符還是'abs'函數的目標可能是什麼? – moooeeeep

回答

1
僅有

投一側到另一符號性。你必須確保該符號數不爲負,如果你投的是無符號 - 否則的-1 < 100比較不會有理想的結果,因爲(unsigned)(-1) == UINT_MAX - ,或無符號數不溢出,如果你投,要簽署。在這些情況下,添加一個附加條件來對待它們。

對於上述特定情況下,我會用

assert(num <= (int)(MAX_SIZE/sizeof(int))); 
// num <= MAX_SIZE/(int)sizeof(int) if I'm in a mean mood 

如果num可能是負和

assert((unsigned)num <= MAX_SIZE/sizeof(int)); 

如果num保證是負數。

+0

謝謝!那麼,我的第一個問題是,C中有一個模數(我們用在數學中的)模數?有些東西是| -5 | = 5? – Manish

+1

你的意思是'abs()'而不是模數? – Bart

+0

將帶符號的數字轉換爲無符號類型是安全的,但不是相反。 – dreamlax

2

如果您知道正確的操作數是< = INT_MAX,您可以將其轉換爲int

int bla; 

... 

if (bla < (int) sizeof expr) { 
    ... 
} 

但如果你可以改變物體bla的類型size_t(這是值sizeof收益的類型),將會變得比投。

+1

OP說'bla'已簽名,所以你可以只是將其更改爲size_t(未簽名)。 –

1

正如我所看到的,您的int num可以採取任何負值和正值,最高爲MAX_SIZE/sizeof(int)。否則,你會宣佈num爲確保無符號整數...

會在你的情況下,這個附加條件的幫助擴展您的斷言語句?

assert(num < 0 || /* make the signed check */ 
    (unsigned int)num <= MAX_SIZE/sizeof(int) /* the unsigned remainder */ 
);