簡體   English   中英

了解擴大和縮小轉換C ++

[英]understanding widening and narrowing conversions C++

我想了解C ++類型以及擴展和縮小轉換的更多細節(特定於C ++ 03)。我知道您不能在一個問題線程中放置多個問題,但是所有這些問題都與同一主題相關。 現在我有了C ++類型和范圍msdn

現在考慮以下示例:

int a = 35000;
short b;
b=a;

現在在上面的示例中,我知道a是4個字節, b是2個字節。 我知道,變寬的轉換會提高精度,而變窄的轉換會降低精度。 我相信上面的示例將縮小范圍(因為存在數據丟失),其中4個字節變為兩個字節。 但是,在某些情況下,我感到困惑,是在進行轉換還是擴大轉換? 我們是否應該查看類型的字節數以確定是轉換還是縮小轉換,還是應該查看范圍? 我也讀到要縮小轉換范圍,需要顯式強制轉換,但是在這種情況下,編譯器沒有指出任何錯誤,而是隱式地進行了錯誤的轉換。 關於為什么會發生任何建議? 我正在使用VS2010

縮小不一定僅取決於大小。 例如, long longdouble都通常具有相同的大小(每個64位)。 盡管如此, 任何方向的轉換都是一種狹窄的轉換,因為信息可能以任何一種方式丟失。 在相同大小的有符號整數類型和無符號整數類型之間進行轉換時,可能會發生同樣的情況-任一方向上的轉換都可能丟失信息(即,導致值與輸入不匹配),因此兩者都被視為變窄轉換。

如果您僅在相同的...類類型內工作(例如,所有帶符號的整數或所有浮點數),則可以使用項目的大小來確定轉換是否涉及縮小(理論上有時/ situations,這是錯誤的,但對於大多數硬件和編譯器提供的類型而言,它都是正確的。

還要注意,當源是文字時,C ++確實為轉換添加了一些例外,並且即使源類型的某些值可能導致信息丟失,也可以將源放在目標中而不會丟失信息。

例如,如果我做類似float a = 3.5; ,文字3.5類型為double但是由於它是文字,並且可以轉換為float而不丟失信息,因此即使在禁止縮小轉換的地方(例如,大括號的初始化列表),也可以使用它。

對於整數類型,精度始終為1。加寬轉換會增大范圍,縮小轉換會減小范圍。

http://msdn.microsoft.com/en-us/library/s3f49ktz.aspx

賣空的范圍是–32,768至32,767。 您輸入的數字大於3500。 最終發生的是數字被塞入較小的字節數,從而導致環繞錯誤(b為負)。 (具體細節與2的補碼有關,而與2的補碼無關。但是對於您的水平,只需說“您破壞了它,那是行不通的”就足夠了)。

為了避免這種情況,請使用-Wnarrowing-Wall以及gcc或/Wall使用Visual Studio編譯器進行編譯(我實際上不知道/ Wall是否會捕獲它)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM