2017-03-14 98 views
3

GCC警告說,這種代碼:爲什麼在unsigned char之間添加隱式轉換?

unsigned char i = 1; 
unsigned char j = 2; 
i += j; 

說:

warning: conversion to 'unsigned char' from 'int' may alter its value [-Wconversion] 
    i += j; 
     ^

似乎j被隱式轉換爲int
爲何添加相同類型的變量會發生隱式轉換?

+3

這就是C的工作原理。針對效率的歷史原因,存在對字符大小有符號整數的隱式轉換。 –

+0

正確的術語是_implicit conversion_。 Cast意味着程序員使用了一個運算符'(type)',所以它總是顯式的。演員陣容將強制進行轉換,但轉換也可能發生在沒有演員陣容的情況下。 – Lundin

+0

@Lundin固定。謝謝。 –

回答

4

Ç任務整數優惠,引述C11 N1570/6.3.1.1p2

以下可以在表達式中使用的任何地方可使用int或unsigned int:

  • 一個整型對象或表達式(而不是int或unsigned int),其整數轉換等級小於或等於int和unsigned int的等級。

如果int可以表示原始類型(如由寬度的限制,對於一個位字段)的所有值,該值被轉換爲int

所以使用您的unsigned char可變在這樣的表達中,並且因此被轉換爲int,因爲i += j在功能上等同於i = i + j

如果您知道某些結果是在unsigned char的範圍內,那麼就適用強制轉換爲分配,這樣之前的加法的結果:

i = (unsigned char)(i + j) 
+0

這個工程,但我認爲在這種情況下'char'數據類型使用不當。我的意思是爲什麼要首先將文本'1'和'2'的存儲聲明爲'char's?如果存儲位置用於保存整數和字符,則可以使用整數類型,因爲字符使用較小的存儲空間。 – Lym

+0

@Lym-空間考慮的一個原因。不是你經常在託管系統上想到的東西,但是對於小的偏移量,人們可能會覺得有義務選擇最小的類型。 (當然'uint8_t'是更好的選擇)。 – StoryTeller

+0

如果你不介意我的問題,你有沒有發現自己處於一種情況或閱讀採用這種方法的代碼。在我看來,願意丟失一些數據,由於截斷在任何情況下都是一個壞主意。只是尋找案例研究。 – Lym

5

下面介紹一下C11草案標準說約(幾乎)在§5.1.2.3這個非常情況下(第15頁):

實施例2

在執行片段

char c1, c2; 
/* ... */ 
c1 = c1 + c2; 

的「‘整數優惠’」要求抽象機 促進每個變量的值,以int尺寸,然後添加兩個 int S和截斷的總和。假設增加了兩個char s可以得到 沒有§5.1.2.3環境15 ISO/IEC 9899:201x委員會草案 - 2011年4月12日N1570溢出或者溢出包裝無聲地打包到 產生正確結果,實際執行只需要生成 相同的結果,可能會省略促銷。

因此,這是因爲標準要求完成。如果你看看生成的代碼,編譯器非常(非常)有可能在實踐中完全不做轉換。

相關問題