強制型別轉換是否改變變數的位元表示?

時間 2021-06-05 05:46:29

1樓:Shiwei Wang

嚴格來說,要輸出unsigned short int,format應該是%hd

2樓:RednaxelaFX

有時候C的cast是會讓bit value發生變化的,例如整型與浮點型之間的轉換。

inti

=...;

floatf=

(float)i

;//bitpattern

changes

此時要想保持bit value不變,C裡的「奇技淫巧」之一就要出場了:

可以用union:

union

dummy

;inti=

...;

dummy.i

=i;floatf=

dummy.f

;//bitpattern

sameasi

也可以用指標:

inti

=...;

floatf=

*((float*)

&i);但這個例子只是帶符號和對應的無符號型別之間的轉換,例中其實a和ua的bit value值是一樣的。只是列印出來看似不同。

這是因為在C裡,對於可變長度引數(varargs),引數傳遞整型最小也要int/unsigned int,而浮點型最小要double;窄於這兩種型別的數值型別都會在引數傳遞時擴充套件到對應的型別。

題主列印a與ua時用的printf()恰好就是用varargs的。其原型為:

intprintf

(const

char

*format

,...);

於是a和ua都是通過那個"..."也就是varargs傳遞過去的,傳遞時就先分別提公升到了int / unsigned int,所以用%x列印出的a有32位寬——從a做帶符號擴充套件而來;而其實用%x列印出的ua也有32位寬——按照unsigned規則從ua做無符號擴充套件而來,只不過前導0預設沒輸出而已。

C double型別強制轉換int時,為什麼會有這樣的結果

補充一下 黃飛飛 的答案,double 型別的0.3的52位尾數恰好是 後面的 因為第53位是0都被捨去.所以實際的浮點表示比0.3小 lol就是那只熊貓 浮點型儲存的時候由於位數的原因會有精度損失,比如0.3在儲存的時候可能是0.29999999999999,也可能是0.3000000000000...

C語言中強制型別轉換是如何實現的?

涇渭漳淮 強制轉換時怎麼實現的?通常是由單獨的CPU指令實現的,也就是硬體實現的。5立方之後是125,125開立方之後是幾?嚴格的數學上應該是5,但實際上計算機有精度的限制,計算結果會有誤差,計算機計算得到的結果可能是4.9999999999999435452340065849之類的,將這個值直接取...

對於指標的強制型別轉換,結果會是什麼?

計算機的標量可以理解為只有整型和浮點型兩種型別,整型由CPU的ALU計算,而浮點型由CPU的浮點運算器來運算。大部分整型被實現為補碼,從機器的角度來看,補碼不需要考慮整數的正負,加法原則是一致的。一般只有整型和浮點型進行相互轉換時,CPU才會呼叫轉換的指令更改編碼,其它情況下只是更改對乙個二進位制數...