linux int64_t 头文件,这对int64_t的处理是GCC和Clang的错误吗?
你不需要去POSIX對它進行排序,ISO C控制這個特定的方面(下面的參考是C11標準).
這個答案的其余部分將成為所有“語言律師”,以顯示為什么將未添加的行為添加到已簽名的值中,以及為什么兩個答案(真和假)都有效.
首先,您在ISO中未定義int64_t的爭論并不十分正確.第7.20.1.1節精確寬度整數類型在引用intN_t類型時指出:
The typedef name intN_t designates a signed integer type with width N,and a two’s complement representation. Thus,int8_t denotes such a signed integer type with a width of exactly 8 bits.
These types are optional. However,if an implementation provides integer types with widths of 8,16,32,or 64 bits,and (for the signed types) that have a two’s complement representation,it shall define the corresponding typedef names.
這就是為什么你不需要擔心POSIX以某種方式定義這些類型的原因,因為ISO定義它們完全相同(兩個補碼,沒有填充等),假設它具有適當的能力.
所以,既然我們已經建立了ISO確定它們(如果它們在實現中可用),現在讓我們看看6.5 Expressions / 5:
If an exceptional condition occurs during the evaluation of an expression (that is,if the result is not mathematically defined or not in the range of representable values for its type),the behavior is undefined.
添加兩個相同的整數類型肯定會給你相同的類型(至少在int64_t的等級,遠高于整數提升完成的點1),因為這是由6.3.1.8中規定的通常的算術轉換決定的.在處理各種浮點類型(其中int64_t不是)的部分之后,我們看到:
If both operands have the same type,then no further conversion is needed.
在同一部分的早期,您會找到一個聲明,該聲明在找到常見類型后指示結果的類型:
Unless explicitly stated otherwise,the common real type is also the corresponding real type of the result.
因此,假設INT64_MAX 1的結果實際上不適合int64_t變量,則行為未定義.
根據你的注釋,int64_t的編碼表明添加一個將包裝,你必須明白,它不會改變它根本未定義的子句.在這種情況下,實現仍然可以自由地執行任何操作,即使根據您的想法沒有意義.
并且,在任何情況下,表達式INT64_MAX 1> INT64_MAX(其中1經歷整數提升為int64_t)可以簡單地編譯為1,因為可以說比實際遞增值和進行比較更快.這是正確的結果,因為任何東西都是正確的結果:-)
從這個意義上講,它與實現轉換沒有什么不同:
int ub (int i) { return i++ * i++; } // big no-no
:
int x = ub (3);
進入更簡單,幾乎肯定更快:
int x = 0;
您可能認為答案會更好,因為9或12(取決于何時執行副作用)但是,如果未定義的行為是打破編碼器和編譯器之間的契約,編譯器可以自由地做任何想做的事情.
在任何情況下,如果你想要一個定義良好的函數版本,你可以選擇以下內容:
int stupid (int64_t a) {
return (a == INT64_MAX) ? 0 : 1;
}
這可以在不訴諸未定義的行為的情況下獲得所需/預期的結果:-)
1如果int的寬度實際上大于64位,則此處可能存在邊緣情況.在這種情況下,很可能整數提升將強制int64_t為int,允許表達式被很好地定義.我沒有詳細研究過,所以可能是錯的(換句話說,不要把它視為我答案的福音部分)但是值得記住的是檢查你是否得到了一個int的實現超過64位寬.
總結
以上是生活随笔為你收集整理的linux int64_t 头文件,这对int64_t的处理是GCC和Clang的错误吗?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 学生用计算机怎么用视频,19.使用ZOO
- 下一篇: android按钮点击无响应时间,And