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

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

在C中被簽名為無符號轉換-它總是安全的嗎?

在C中被簽名為無符號轉換-它總是安全的嗎?

慕姐4208626 2019-06-20 11:21:34
在C中被簽名為無符號轉換-它總是安全的嗎?假設我有以下C代碼。unsigned int u = 1234;int i = -5678;unsigned int result = u + i;這里正在進行什么隱式轉換,這段代碼對所有的值都是安全的嗎?u和i?(安全,從某種意義上說,即使結果在本例中,將溢出到某個巨大的正數,我可以將其轉換回INT得到真正的結果。)
查看完整描述

3 回答

?
慕少森

TA貢獻2019條經驗 獲得超9個贊

從簽名到未簽名的轉換只需復制或重新解釋符號值的表示。引用C標準(C99 6.3.1.3):

當具有整數類型的值轉換為_bool以外的另一個整數類型時,如果該值可以由新類型表示,則它將保持不變。

否則,如果新類型沒有符號,則通過重復添加或減去比新類型中可以表示的最大值多一個值來轉換值,直到該值位于新類型的范圍內為止。

否則,將對新類型進行簽名,并且不能在其中表示值;結果要么是實現定義的,要么引發實現定義的信號。

對于現在幾乎通用的兩種補碼表示,規則確實對應于重新解釋比特。但是對于其他表示(符號和大小或1的補碼),C實現仍然必須安排相同的結果,這意味著轉換不能只是復制比特。例如,(無符號)-1=UINT_MAX,而不管表示形式如何。

通常,C中的轉換定義為在值上操作,而不是在表示上操作。

要回答原來的問題:

unsigned int u = 1234;int i = -5678;unsigned int result = u + i;

i的值轉換為無符號int,生成UINT_MAX + 1 - 5678..然后將此值添加到無符號值1234中,生成UINT_MAX + 1 - 4444.

(與無符號溢出不同,簽名溢出會調用未定義的行為。概括是常見的,但不是C標準所保證的-編譯器的優化可能會對做出不合理假設的代碼造成極大的破壞。)


查看完整回答
反對 回復 2019-06-20
?
POPMUISE

TA貢獻1765條經驗 獲得超5個贊

圣經:

  • 添加操作將使int轉換為無符號int。
  • 假設兩個補碼表示和大小相等的類型,位模式不會改變。
  • 從無符號int到有符號int的轉換取決于實現。(但現在大多數平臺上,它的工作方式可能與你預期的一樣。)
  • 在不同大小的有符號和無符號組合的情況下,規則要復雜一些。


查看完整回答
反對 回復 2019-06-20
  • 3 回答
  • 0 關注
  • 599 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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