亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

與負數進行比較時,為什么會出現sizeof運算符?

與負數進行比較時,為什么會出現sizeof運算符?

C
森林海 2019-08-23 10:10:39
與負數進行比較時,為什么會出現sizeof運算符?這里到底發生了什么?輸出現在為“False”:#include <stdio.h>int main(){      if (sizeof(int) > any_negative_integer)          printf("True");      else          printf("False");      return 0;}如果我將其更改為:if (sizeof(int) < any_negative_integer)輸出為“True”。
查看完整描述

2 回答

?
慕桂英3389331

TA貢獻2036條經驗 獲得超8個贊

sizeof返回的size_t是無符號的,因此-1被轉換為非常大的無符號數。使用正確的警告級別會對此有所幫助,clang使用-Wconversion-Weverything注意這不是生產用途)標志警告我們:

warning: implicit conversion changes signedness: 'int' to 'unsigned long' [-Wsign-conversion]
   if (sizeof(int) > -1)
                   ~ ^~

對于gcc您使用-Wextra標志收到類似的警告:

warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
    if (sizeof(int) > -1)
                    ^

作為參考,我們知道的size_t無符號來自C99標準草案部分7.17 的通用定義它說:

 size_t

這是sizeof運算符的結果的無符號整數類型; [...]

注意,它沒有指定關于類型的任何其他內容,在我的特定情況下,它恰好是unsigned long,但它不一定是。

的轉化-1是由于正常的算術轉換覆蓋部6.3.1.8 通常的算術轉換這表示:

[...]

否則,如果具有無符號整數類型的操作數的秩大于或等于另一個操作數的類型的秩,則具有有符號整數類型的操作數將轉換為具有無符號整數類型的操作數的類型。

否則,如果帶有符號整數類型的操作數的類型可以表示具有無符號整數類型的操作數類型的所有值,則具有無符號整數類型的操作數將轉換為帶有符號整數類型的操作數的類型。

否則,兩個操作數都轉換為無符號整數類型,對應于帶有符號整數類型的操作數的類型。

因此,唯一的時間-1不會被轉換為無符號值,如果int可以表示size_t的所有值,這不是這里的情況。

為什么-1最終成為一個大的無符號值,實際上它最終成為無符號類型的最大值是由于6.3.1.3Signed和無符號整數部分所說的:

否則,如果新類型是無符號的,則通過重復地添加或減去一個可以在新類型中表示的最大值來轉換該值,直到該值在新類型的范圍內。49)

所以我們最終得到:

-1 + (UMAX + 1)

這是:

UMAX

因此最終得到:

if (sizeof(int) > UMAX )


查看完整回答
反對 回復 2019-08-23
?
大話西游666

TA貢獻1817條經驗 獲得超14個贊

因為sizeof()返回一個size_t無符號類型。由于在比較之前進行隱式轉換,比較有符號和無符號類型可能會產生令人驚訝的結果。


查看完整回答
反對 回復 2019-08-23
  • 2 回答
  • 0 關注
  • 887 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號