c 語言裡 型別轉換那些事兒

2021-06-27 18:05:06 字數 3593 閱讀 4688

一: 起因

(1)最近接觸了型別轉換,例如有符號數轉化為無符號數 ---- int 轉化為 unsigned int型別,莫要想當然的轉化;

(2)彌補一下自己當初學習計算機組成原理時,原碼、反碼、補碼就比較容易混淆的概念;

(3)double型別的如何判斷某乙個引數是否為零,直接 == 0.0,,貌似可以 ---- 確實有時可以,但是有時卻不可以,這是為什麼?

(4)知識補充:在int 有符號數中:0x80000000 (除了符號位為1,其餘全部為零) ---- 最小的數(-2147483648即-2^32) ;

0x80000001 ---- 次最小數( -2147483647即-2^32-1);

0xfffffffe (-2) ;0xffffffff(連同符號位全部是1) ----- 最大的負整數(-1);

0x7ffffff (除了符號位為0,其餘全部為1)---- 最大的數(2147483647即2^32-1)

(5)問題是 0x80000000 - 1 是多少呢?(最大的數0x7ffffff); 0x7ffffff  + 1又是多少呢?(最小的數0x80000000 );

0x80000000 - 1 是如何計算的嗎?(0x80000000 + 0xffffffff,先把減法變化為加法,即正1變化為負1,溢位位捨掉

二:看真相

(1)**

[cpp]view plain

copy

print

?int min_int = 0x80000000; 

int int_fu1 = 0xffffffff; 

int max_int = 0x7fffffff; 

cout << "min_int= "

<< min_int << "\tmin_int-1= "

<< min_int-1 <

"\t(unsigned)min_int = "

<< (unsigned int)min_int << endl; 

cout << "int_fu1= "

<< int_fu1 << "\tint_fu1-1= "

<< int_fu1-1 <

"\t(unsigned)int_fu1 = "

<< (unsigned int)int_fu1 << endl; 

cout << "0x7fffffff= "

<< 0x7fffffff << "\t0x7fffffff-1= "

<< 0x7fffffff +1 << endl; 

double test_zero = 1.333333; 

cout << (test_zero-1.3333334) << endl; 

if(0 == (test_zero-1.3333334)) 

cout << "(test_zero-1.3333334) = "

<< (test_zero-1.3333334) <

"\t0 == (test_zero-1.3333334)"

<< endl; 

else

if((test_zero-1.3333334)>-1e-6 && (test_zero-1.3333334) < 1e-6) 

cout << "(test_zero-1.3333334) = "

<< (test_zero-1.3333334) <

"\t(test_zero-1.3333334)>-1e-6 && (test_zero-1.3333334) < 1e-6"

<< endl; 

int min_int = 0x80000000;

int int_fu1 = 0xffffffff;

int max_int = 0x7fffffff;

cout << "min_int= " << min_int << "\tmin_int-1= " << min_int-1 <<

"\t(unsigned)min_int = " << (unsigned int)min_int << endl;

cout << "int_fu1= " << int_fu1 << "\tint_fu1-1= " << int_fu1-1 <<

"\t(unsigned)int_fu1 = " << (unsigned int)int_fu1 << endl;

cout << "0x7fffffff= " << 0x7fffffff << "\t0x7fffffff-1= " << 0x7fffffff +1 << endl;

double test_zero = 1.333333;

cout << (test_zero-1.3333334) << endl;

if(0 == (test_zero-1.3333334))

cout << "(test_zero-1.3333334) = " << (test_zero-1.3333334) <<

"\t0 == (test_zero-1.3333334)" << endl;

else if((test_zero-1.3333334)>-1e-6 && (test_zero-1.3333334) < 1e-6)

cout << "(test_zero-1.3333334) = " << (test_zero-1.3333334) <<

"\t(test_zero-1.3333334)>-1e-6 && (test_zero-1.3333334) < 1e-6" << endl;

(2)結果圖

(3)結果分析

浮點數(double)之所以不能用 == 和 != 是因為浮點數在記憶體中都是按精度來儲存的(有最大精度位數,也可以設定精度位數),所以你看到的 3.12也許本來是3.123456取的小數點後2位位精度,所以當與另乙個 3.12進行比較時可能會出現很多種情況,如果另乙個3.12其實是3.121111取的小數點後2位位精度的話,那麼兩個數你看著相等,其實是不等的。

所以你辦在對浮點數進行比較的時候一般都是相減然後去和乙個精度比較。但是有時,比較確實可以通過,因為那是僥倖。

可以看到最小數 和 最大數之後一步之遙。

原碼 反碼 補碼 的知識補充

(4)相關學習    c++中的懸浮指標和野指標 二級指標

我不是乙個合格的程式設計師

再一次感覺到自己的無知

c++深拷貝和淺拷貝

面試經常問的c語言變數在記憶體中的分布(vc6.0)

c 語言裡 型別轉換那些事兒

一 起因 1 最近接觸了型別轉換,例如有符號數轉化為無符號數 int 轉化為 unsigned int型別,莫要想當然的轉化 2 彌補一下自己當初學習計算機組成原理時,原碼 反碼 補碼就比較容易混淆的概念 3 double型別的如何判斷某乙個引數是否為零,直接 0.0,貌似可以 確實有時可以,但是有...

C語言那些事兒

專案名稱 蘇嵌實訓 嵌入式linuxc第3天 今日進度以及任務 學習了c語言的基本知識 本日任務完成情況 掌握了c語言的基本知識 本日開發 現的問題彙總 c語言中的細節問題要注意 本日未解決的問題 無本日開發收穫 進一步熟悉了c語言其他無 c語言1 c語言之父?丹尼斯里奇 2 c的特點 優勢 語言標...

css裡的那些事兒

一,background position 定位 三種寫法 1 按 比,左上角最小 0 0 右下角最大 100 100 2 x,y 左上角最小 0,0 右下角最大 max,max 3 top,center,left,right,bottom 二,background clip 1,包含那一部分的值 ...