先看一段程式
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
using
namespace
std;
int
_tmain(
int
argc, _tchar* argv)
這段程式的輸出會是什麼呢?
顯然(int)a是將a的值轉換成int型
&a則是a的記憶體位址的二進位制表示
那麼(int&)a是什麼呢?是否等於(int)&a呢?
我們看一下程式執行的結果:
(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的整數形式和浮點形式其記憶體資料是一樣的,因此在這種特殊情形下,兩者相等(僅僅在數值意義上)。
有關 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不能夠互用,因為他們兩種不同的資料...