2013-01-11 57 views
6

有兩種不同但相關大小的向量。較大的是(2 * RESOLUTION) + INDEX_OFFSET(例如2050),較小的只是RESOLUTION(例如1024)。我相信足夠安全的假設uint16_t可以用來包含向量索引。對於C++整數,1除以2可靠等於0,而3/2 = 1,5/2 = 2等。

通過將較大的向量迭代通過將resultIndex增加2來執行。在每次迭代期間,對索引(resultIndex - INDEX_OFFSET)/2處的較小向量進行賦值。

本質上,代碼依賴於這樣的假設:無論架構如何,無論是INDEX_OFFSET是奇數還是偶數,上述除以2總是舍入。例如,如果resultIndex爲0或1,則預期爲0,如果是2或3,則預期爲1,依此類推。這是一個安全的假設,在上面的參數?

N.B.我承認'Dividing integer types - Are results predictable?'的存在,但它似乎並不完全匹配。

+3

以及在非常大的情況下2'2 + 2 = 5'在Woot4Moo的2 – Woot4Moo

+4

:snarky可以很有趣,但在這種情況下,它只是愚蠢的。整體劃分有關於截斷的非常具體的規則,事實是'3/2 == 1'。 –

回答

15

是;這是由語言保證:

[C++11: 5.6/4]:二元/操作者產生的商,和二進制%操作者產生了由第二所述第一表達的除法的餘數。如果/%的第二個操作數爲零,則行爲未定義。 對於整型操作數,/算子產生代數除以任何小數部分的商;如果商可表示結果的類型,(a/b)*b + a%b等於a

3/2,既32是整型操作數;此操作的代數商數爲1.5,當您丟棄小數部分.5時,您將獲得1。這適用於您的其他示例,以及其他所有示例。

+1

非常好,謝謝! – mosi

+1

+1,感謝上帝這是標準。我不能*想象*沒有它的代碼量。 – WhozCraig

+2

注意:在linux =>'信號5:算術異常'通常是由被執行的'0'除法的結果* ...儘管由於編譯器可以假設分頻器不是' 0',奇怪的事情可能會發生(又名「未定義的行爲」)。 –