1. 程式人生 > >判斷機器大小端的兩種實現方式

判斷機器大小端的兩種實現方式

一、為什麼會有大小端之分

這是因為在計算機系統中,我們是以位元組為單位的,每個地址單元都對應著一個位元組,一個位元組為 8bit。但是在C語言中除了8bit的char之外,還有16bit的short型,32bit的long型(要看具體的編譯器),另外,對於位數大於 8位的處理器,例如16位或者32位的處理器,由於暫存器寬度大於一個位元組,那麼必然存在著一個如何將多個位元組安排的問題。因此就導致了大端儲存模式和小端儲存模式。

二、定義

大端模式:

大端模式就是指把資料的高位元組儲存在記憶體的低地址中,資料的低位元組儲存在記憶體的高地址中,這和我們一般的閱讀順序是一致的。

小端模式:

小端模式與大端模式相反,資料的高位元組位置儲存在記憶體的高地址處,資料的低位元組儲存在記憶體的低地址處。這種儲存模式將地址的高低和資料位權有效地結合起來,高地址部分權值高,低地址部分權值低。

圖解

畫張圖簡單解釋下大小端的區別,比如我們要存取一個0x12345678的資料,在大小端機器的存取方式分別是:

這裡寫圖片描述

三、判斷機器大小端方式

①字元指標判斷

在32位平臺下,int佔4個位元組,而char型別的指標是佔一個位元組的,如果我們把int強傳為char型別的指標,只會儲存一個位元組的資料,那麼我們只需要判斷char裡面的第一個位元組和int裡面的第一個位元組是否是一致即可判斷。
如果一致則為小端模式,反之為大端模式。

注:

下面程式碼我們令 int a=1 如果是小端模式,int下1會存放在在低地址處,而強傳為char型別的指標,1也在低地址處,所以可以判斷。

#include <iostream>
using namespace std;
int main()
{
    int a = 1;
    if (*(char*)&a == 1)
        cout << "小端模式" << endl;
    else
        cout << "大端模式" << endl;
    return 0;
}

這裡寫圖片描述

如上所示,我的機器是小端機器。

②聯合體判斷

由於聯合體所有資料共享一塊地址空間,存放資料的所有成員都是從低地址開始存放,所以我們可以在聯合體內定義一個int和一個char型別變數,然後在外部例項化的時候建立int變數,用char變數呼叫,相當於隱式型別轉化,如果結果為1,則低位元組存放在低地址,既是小端機器,反之大端機器。

#include <iostream>
using namespace std;
union Test
{
    int a;
    char b;
};
int main()
{
    Test t;
    t.a = 1;
    if (t.b == 1)
        cout << "小端機器" << endl;
    else
        cout << "大端機器" << endl;
    return 0;
}

這裡寫圖片描述

相關推薦

判斷機器大小實現方式

一、為什麼會有大小端之分 這是因為在計算機系統中,我們是以位元組為單位的,每個地址單元都對應著一個位元組,一個位元組為 8bit。但是在C語言中除了8bit的char之外,還有16bit的short型,32bit的long型(要看具體的編譯器),另外,對於位數

判斷機器大小實現方法

大端模式(Big-endian): 是指資料的低位(就是權值較小的後面那幾位)儲存在記憶體的高地址中,而資料的高位,儲存在記憶體的低地址 中,這樣的儲存模式有點兒類似於把資料當作字串順序處理:地址由小

自動補全、自動提示的實現方式(前端實現與後實現

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> <link rel="style

移動HTML5導航欄吸頂:IOS(sticky)和Android實現方式

混合App,前端H5頁面,實現導航欄滑動到的時候貼頂。 注意: 首先寫的時候,監聽scroll事件,滑動到指定位置時改為定位 position:fixed;,實際運用過程中,IOS無法實時監聽scroll事件,在滾動停止之後才觸發的 $(wind

hadoop streaming reducejoin的python實現方式

實現student和course資料表的join操作,以學生編號(sno)為連線欄位 測試資料 student.txt檔案 #以一個空格分隔 #學生編號 姓名 #sno sname 01 lily 02 tom 03 jac

[轉]Web APi之認證(Authentication)實現方式【二】(十三)

用戶數 ted das 客戶 元素 基礎 目標 開始 net 本文轉自:http://www.cnblogs.com/CreateMyself/p/4857799.html 前言 上一節我們詳細講解了認證及其基本信息,這一節我們通過兩種不同方式來實現認證,並且分析如

多線程實現方式的區別

http [] tick 避免 main 單繼承 style 區別 tar 請解釋Thread類與Runnable接口實現多線程的區別?(請解釋多線程兩種實現方式的區別?) 1. Thread類時Runnable接口的子類,使用Runnable接口實現多線程可以避免單繼承局

JPA 派生標識符的實現方式

string column public tid man pri one embed page 方法一:@Entity@IdClass(ModuleId.class)public class Module { @Id private Integer index;

14、Fibonacci的實現方式

等於 cheng pos art log ref clas gpo tar 斐波納契數列,又稱黃金分割數列,指的是這樣一個數列:1、1、2、3、5、8、13、21、……在數學上,斐波納契數列以如下被以遞歸的方法定義:F0=0,F1=1,Fn=F(n-1)+F(n-2)(n&

Web APi之認證(Authentication)實現方式【二】(十三)

基於web 推薦 zed {0} scheme sage https 函數 ges 原文:Web APi之認證(Authentication)兩種實現方式【二】(十三)前言 上一節我們詳細講解了認證及其基本信息,這一節我們通過兩種不同方式來實現認證,並且分析如何合理的利用

spring ----> aop的實現方式

select imp ack exe readv expr gpo for public 實現1:基於xml 1 package com.rr.spring3.interf; //接口 2 3 public interface SayHello { 4 5

Ajax的實現方式

enc () != 部分 pen clas servlet 瀏覽器 pop //ajax的jquery實現 function aclick(){//alert("測

圖形驗證碼的實現方式

ava 輸入 urn color deb rect lac prev 後臺 情形一:圖形驗證碼跟短信驗證碼一起,只需要將後臺提供的動態鏈接填到(id="img")的src中即可生成動態驗證碼。 然後,在需要請求接口的地方,只需把(id="imgCode")中用戶輸入的信息通

前端路由的實現方式

color 前端路由 his 頁面 無刷新 原理 range window 使用 什麽是路由? 路由是根據不同的 url 地址展示不同的內容或頁面 早期的路由都是後端直接根據 url 來 reload 頁面實現的,即後端控制路由。 後來頁面越來越復雜,服務器壓力越來越大,隨

題目24-多線程實現方式

類重寫 直接 解決方案 做的 子類 是否為空 缺點 多線程同步 弊端 1、多線程兩種實現方式 (1)繼承Thread 定義類繼承Thread 重寫run方法 把新線程要做的事寫在run方法中 創建線程對象 開啟新線程, 內部會自動執行run方法(2)實現Runnable

線程的實現方式

class args new pub nds runnable implement ide start 線程的兩種實現方式 (1)繼承Thread類`` /** * 繼承Thread類 * */ public class PayThread extends T

iOS活動倒計時的實現方式

ofo orm ren 年-月 ats omd string 分享 截圖 代碼地址如下:<br>http://www.demodashi.com/demo/11076.html 在做些活動界面或者限時驗證碼時, 經常會使用一些倒計時突出展現. 現提供兩種方

Brute-Force模式匹配演算法實現方式

1. public static int indexOf(String mainStr,String subString,int start) { if((mainStr.length()<subString.length()) || mainStr==null || subStr

單例的實現方式、多個版本及利弊對照

        單例設計模式,顧明思議,只有一個例項,先交代重要一點,為防止外界對該類進行例項化,需要把類的建構函式宣告為私有的,這樣大家對原理理解更深入些。 1、餓漢式 餓漢模式單例程式碼,經典,可用,無需改進。 package com.sing

Java base64加密解密 實現方式

1、為什麼要使用Base 64     Base 64主要用途不是加密,而是把一些二進位制數轉成普通字元,方便在網路上傳輸。 由於一些二進位制字元在傳輸協議中屬於 控制字元,不能直接傳送,所以需要轉換一下才可以。由於某些系統中只能使用ASCII字元,Base64