簡體   English   中英

我似乎不理解該程序關於將整數指針轉換為字符指針的輸出

[英]I don't seem to understand the output of this program regarding conversion of integer pointer to character pointer

在下面的程序我initiliaze 255因此,在二進制,我們有:

0000 0000 1111 1111

這是在十六進制:

0x 0 0 ff

因此根據Little-Endian布局:首先存儲低位字節 - 0xff


#include<cstdio>
int main()
{
int i=0x00ff; //I know 0xff works. Just tried to make it understable
char *cptr=(char *)&i;
if(*(cptr)==-127)
printf("Little-Endian");
else
printf("Big-Endian");

}

所以,當我的地址存儲在CPTR應該指向低字節(假設小端,怎么這是我的系統了)。

因此, * cptr包含1111 1111 這應該降到-127。 因為, 1位用於符號位。

但是當我打印* cptr的值時我得到-1 ,為什么會這樣呢?

請解釋我哪里出錯了?

你在哪里知道1111 1111-127 顯然,您假設“符號位”應該獨立於其余位進行解釋,即將符號位設置為+127二進制表示應該將其轉換為-127 ,對吧? 那么,以這種方式工作的表示確實存在:它被稱為Signed Magnitude表示。 但是,它在實踐中幾乎未被使用。 大多數現代機器使用2的補碼表示來表示簽名類型,這是完全不同的事情。

在二進制補碼機1111 1111一直是-1 -127將是1000 0001 並且1000 0000-128 ,BTW。

最重要的是要記住, char類型不一定是簽名的。 如果您特別需要簽名類型,則必須拼寫出來: signed char

1111 1111-1因為-1是最大的負整數。 請記住, -1在數學中大於-2 ,因此為方便起見,二進制表示應具有相同的屬性。 因此1000 0001將代表-127

有三種方法可以用二進制表示負數:有符號幅度,1補碼和2補碼。

有符號的幅度最容易理解:一位用於表示符號(0 = +,1 = - ),其他位表示值的大小。
在補碼中,通過對相應的正數進行逐位求逆來獲得負值(切換所有位)
在二進制補碼中,正數和負數之間轉換的方式不那么簡單(翻轉所有位,然后加1),但它具有一些特性,使其在計算機中特別有用。

因為計算機在二進制補碼表示中運行良好,所以大多數計算機都使用它來表示整數。

出了什么問題是你期望一個有符號的幅度表示(最高位設置,所以負值。所有其他位也設置,所以值= -127),但計算機使用二進制補碼表示(其中所有bis set = = -1)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM