有關 int 和 int 的區別

2021-06-17 00:03:20 字數 2183 閱讀 7180

先看一段程式?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

#include "stdafx.h"

#include

usingnamespacestd;

int_tmain(intargc, _tchar* argv)

這段程式的輸出會是什麼呢?

顯然(int)a是將a的值轉換成int型

&a則是a的記憶體位址的二進位制表示

那麼(int&)a是什麼呢?是否等於(int)&a呢?

【注意:(int)&a實際是將二進位制的位址轉化成int型】

我們看一下程式執行的結果:

(int&)a的值很古怪,1065353216

不妨嘗試輸出(int)&a,就會發現(int&)a≠(int)&a

實際上,(int&a)是與*((int*)&a)等價的,意思都是將&a這個位址上的32位看成int型,即使儲存在這裡的可能不是int型資料

(int&)a為什麼會是1065353216呢?

這和浮點數在記憶體中的儲存格式有關,float 1.0在記憶體中儲存為(按ieee754規定):

符號位           階(8位)                          尾數(23位)

0            01111111       000 0000000000 0000000000

於是將其看做int型數值的話

00111111100000000000000000000000(2)   =   1065353216(10)

這正是程式輸出的結果

小結:(int)a實際上是以浮點數a為引數構造了乙個整型數,該整數的值是1。

(int&)a則是告訴編譯器將a當作整數看(並沒有做任何實質上的轉換)。

因為1以整數形式存放和以浮點形式存放其記憶體資料是不一樣的,因此兩者不等。

對b的兩種轉換意義同上,但是0的整數形式和浮點形式其記憶體資料是一樣的,因此在這種特殊情形下,兩者相等(僅僅在數值意義上)。

~the end~

ps:

int&是引用,可以說是乙個變數的別名,在定義時必須繫結到乙個變數

比如int i = 0;

int& n = i;

n++;

這時i = 1

一般用在函式引數中

比如交換兩個數

void swap(int& a, int& b)

這樣呼叫這個函式

int x = 2, y = 3;

swap(a, b);

這是x = 3, y = 2;

而如果用void swap(int a, int b) 則是複製x和y到函式裡

不會改變x, y的值

display(ostream & out)

比如這裡呼叫display(cout);則在函式裡修改out,等同於修改cout

比如函式中out << 10 << endl;

等同於cout << 10 << endl;

而如果是display(ostream out);則out為cout的複製,並非本身

比如函式中out << 10 << endl;

但cout沒有改變

有關 int 和 int 的區別

先看一段程式 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 include stdafx.h include usingnamespacestd int tmain intargc,tchar argv...

long和int的區別

short與long兩個限定符的引入可以為我們提供滿足實際需要的不同長度的整形數。int通常代表特定機器中證書的自然長度。short型別通常為16位,long型別通常為32位,int型別可以為16位或32位。各編譯器可以根據硬體特性自主選擇合適的型別長度,但要遵循下列限制 short與int型別至少...

Integer 和int的區別

1.int是基本的資料型別,直接存數值 2.integer是int的封裝類 integer 是物件,用乙個引用指向這個物件 integer 是乙個類,是int的擴充套件,定義了很多的轉換方法。3.int和integer都可以表示某乙個數值 4.int和integer不能夠互用,因為他們兩種不同的資料...