當前位置:首頁 » 編程語言 » c語言大端小端的程序
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

c語言大端小端的程序

發布時間: 2022-01-30 02:03:32

1. 簡單的C程序判斷系統是大端還是小端方式

創建一個C程序main.c,將下邊的代碼復制進去並編譯、運行:

[cpp] view plain
#include <stdio.h>

int main(int argc, char **argv)
{
int a = 0x12345678;
char *p;

p = (char *)(&a);
if (*p = 0x78)
printf("Small Endian.\n");
else
printf("Big Endian.\n");
return 0;
}

運行結果顯示,我的Linux系統屬於小端方式。
[php] view plain
> ./endian
Small Endian.

2. 請問,大端法小端法對c語言結構體有影響嗎謝謝

機器的大小端,只是表示數據在內存中存放的順序不同。對數據結構本身沒有影響。

3. 寫一段c語言代碼,來驗證處理器的存儲方式是大端存儲還是小端存儲

#include<stdio.h>
intmain(void)
{
int=0x12345678;
char*p=&;
inti=0;
for(i=0;i<4;i++)
printf("%X ",*p++);
return0;
}

4. c語言中小端次序和大端次序的概念和作用

具體概念去網路吧,少年。
不過舉個栗子,short a = 0xF0F0;

假設左側都是物理地址的高地址那麼這個數據儲存,
大端是:0F0F(IBM等)
小端是:F0F0(大部分機器)
作用是,加深理解一些程序的儲存與出錯原因,然後對於位域的整體賦值有較好考慮。

5. C語言 編寫一個程序確定機器是大端法還是小端法機器

#include<stdio.h>
union node
{
int a;
char b[4];
};

int main()
{
union node t;
t.a=1;
printf("%d\n",t.b[0]);
printf("%d\n",t.b[1]);
printf("%d\n",t.b[2]);
printf("%d\n",t.b[3]);
}
把int的每個位元組讀出來。要是第一個位元組為0證明是大端模式 第一個位元組為1證明是小端模式

6. C語言 判斷大端小端,怎麼判斷

計算機的一個int型數據是用多個位元組表示的,如果在內存中存放時標稱該數據的地址中存放的是數據的最低位元組,就叫小端機,反之把高位元組存放在標稱地址中的則稱為大端機。所以可以定義一個int變數,將其地址強制為char
*型地址,檢測該地址中的數據若是int變數的最低位元組,則是小端機,反之則為大端機。代碼如下:
//#include "stdafx.h"//If the vc++6.0, with this line.
#include "stdio.h"
int main(void){
int n=1;
printf(*(char *)&n ? "小端\n" : "大端\n");
return 0;
}

7. 用c語言寫個函數測試處理器是大端還是小端程序怎麼寫

寫一個函數判斷系統是大端還是小端。若處理器是Big_endian的,則返回0;若是Little_endian的,則返回1.
大端格式:在這種格式中,字數據的高位元組存儲在低地址中,而字數據的低位元組則存放在高地址中
小端格式:與大端存儲格式相反,在小端存儲格式中,低地址中存放的是字數據的低位元組,高地址存放的是字數據的高位元組
聯合體union的存放順序是所有成員都從低地址開始存放。
Int checkCPU ()
{
Union w
{
Int a;
Char b;
}c;
c.a=1;
return (c.b==1);
}

UNIX 網路編程第一卷 78頁 (英文版)給出了這樣一段代碼:
PS: 下面代碼中的unp.h是Stevens 老大自己定義的一個頭文件,具體的代碼在這本書的附錄里有給出來.

代碼
1
2 #include "unp.h"
3
4 int main(int argc ,char ** argv)
5 {
6
7 union {
8 short s;
9 char c[sizeof(short)];
10 }un;
11 un.s = 0x0102;
12 printf("%s\n",CPU_VENDOR_OS);
13
14 if(sizeof(short) == 2)
15 {
16 if(un.c[0] == 1 && un.c[1] ==2 )
17 printf("big-endian\n");
18 else if (un.c[0] == 2 && un.c[1] == 1)
19 printf("little-endian\n");
20 else printf("unknow");
21 }else
22 printf ( "sizeof(short) = %d\n",sizeof(short));
23 exit(0);
24 }
25

8. C語言讀寫二進制文件讀取 大小端,該怎麼解

先看下面的代碼,然後我在簡短的解釋一下。

#include <stdio.h>#include <stdlib.h>#include <string.h>#include <string>#define nmemb 7/****************************************************
Date types(Compiler specific) 數據類型(和編譯器相關)
*****************************************************/typedef unsigned char uint8; /* Unsigned 8 bit quantity */typedef signed char int8; /* Signed 8 bit quantity */typedef unsigned short uint16; /* Unsigned 16 bit quantity */typedef signed short int16; /* Signed 16 bit quantity */typedef unsigned int uint32; /* Unsigned 32 bit quantity */typedef signed int int32; /* Signed 32 bit quantity */typedef float fp32; /* Single precision */
/* floating point */typedef double fp64; /* Double precision */
/* floating point *///int32#define BigtoLittle32(A) ((( (uint32)(A) & 0xff000000 ) >> 24) |
(( (uint32)(A) & 0x00ff0000 ) >> 8) |
(( (uint32)(A) & 0x0000ff00 ) << 8) |
(( (uint32)(A) & 0x000000ff ) << 24))//int16#define BigtoLittle16(A) (( ((uint16)(A) & 0xff00) >> 8 ) |
(( (uint16)(A) & 0x00ff ) << 8))/************************************************************
* Conversion little endian float data to big endian
* *************************************************************/float ReverseFloat(const float inFloat)
{ float retVal; char *floatToConvert = (char*) & inFloat; char *returnFloat = (char*) & retVal; // swap the bytes into a temporary buffer
returnFloat[0] = floatToConvert[3];
returnFloat[1] = floatToConvert[2];
returnFloat[2] = floatToConvert[1];
returnFloat[3] = floatToConvert[0]; return retVal;
}struct matrix
{ int row; int column;
}s[nmemb];void set_s(int j, int x, int y)
{
s[j].row = x;
s[j].column = y;
}bool is_bigendian()
{ int a = 0x1234; char b = *(char *)&a; //b == the Low address part of a
//printf("%c ", b);
if (b == 0x34) { return false;
} return true;
}int main()
{ if (is_bigendian()) { printf("BigEndian ");
} else { printf("LittleEndian ");
}

FILE *fp;
set_s(0, 1, 50);
set_s(1, 1, 80);
set_s(2, 4, 20);
set_s(3, 50, 1);
set_s(4, 80, 2);
set_s(5, 100, 3);
set_s(6, 100, 4); int ans = sizeof(struct matrix); printf("size: %d ", ans); printf("size: %d ", sizeof(s)); if ((fp = fopen("test", "wb")) == NULL) { printf("EROOR "); return 1;
} for (int j = 0; j < nmemb; ++j) { printf("row: %d column: %d ", s[j].row, s[j].column);
}
fwrite(s, sizeof(struct matrix), nmemb, fp); for (int i = 0; i < nmemb; ++i) { float *m = (float*) malloc(sizeof(float) * s[i].row * s[i].column);
bzero(m, sizeof(float) * s[i].row * s[i].column); for (int j = 0; j < s[i].row; ++j) { for (int k = 0; k < s[i].column; ++k) {
m[k + j*s[i].column] = k;
}
}
fwrite(m, sizeof(float), s[i].row * s[i].column, fp); free(m);
}

fclose(fp); printf("11 "); /*
printf("%d ", sizeof(float));
FILE *fp;
if ((fp = fopen("test", "rb")) == NULL) {
printf("EROOR ");
return 1;
}
fread(s, sizeof(struct matrix), nmemb, fp);
for (int i = 0; i < nmemb; ++i) {
printf("row: %d column: %d ", s[i].row, s[i].column);
}

for (int i = 0; i < nmemb; ++i) {
float *m = (float*) malloc(sizeof(float) * s[i].row * s[i].column);
bzero(m, sizeof(float) * s[i].row * s[i].column);
fread(m, sizeof(float), s[i].row * s[i].column, fp);
for (int j = 0; j < s[i].row; ++j) {
for (int k = 0; k < s[i].column; ++k) {
printf("%lf ", m[k + j*s[i].column]);
}
printf(" ");
}
printf(" ");
free(m);
}
fclose(fp);
*/
return 0;
}

fopen和fclose是很常見的,在這里就不做解釋了。我們來看看fwrite和fread,本來以為這個很麻煩,但是用過之後發現這個二進制文件讀寫才是最簡單的。

size_t fwrite(const void * ptr,size_t size,size_t nmemb,FILE * stream);
fwrite()用來將數據寫入文件流中。
stream為已打開的文件指針
ptr 指向欲寫入的數據地址
寫入的字元數以參數size*nmemb來決定。
size表示寫入一個nmemb的內存大小。
fwrite()會返回實際寫入的nmemb數目。

size_t fread(void * ptr,size_t size,size_t nmemb,FILE * stream);
fread()用來從文件流中讀取數據。
stream為已打開的文件指針
ptr 指向欲存放讀取進來的數據空間
讀取的字元數以參數size*nmemb來決定
size表示讀取一個nmemb的內存大小。
fread()會返回實際讀取到的nmemb數目,如果此值比參數nmemb 小,則代表可能讀到了文件尾或有錯誤發生,這時必須用feof()或ferror()來決定發生什麼情況。
返回實際讀取到的nmemb數目。

詳情參見上面的代碼。

另外就是大小端的問題了。關於大小端的具體解釋網上有很多,在此不作解釋。參考上面寫的代碼,我判斷了自己機器是大端還是小端,並且實現了int16,int32已經float數據類型的大小端轉換,大端轉小端,在使用相同的代碼一次小端又變成了大端。

PS:float的大小端轉化我之前一直以為寫的是錯的,因為好多數據轉化之後輸出都是0。後來發現可能是與float類型在內存中的存放有關,我們的程序是對的。

9. C語言的程序

剛才那個同學的回答有問題,因為int 定義的數不能達到100000000
我的程序為
#include <stdio.h>
void main()
{
int a,i,min;
scanf("%d",&a);
min=a;
for(i=1;i<4;i++)
{
scanf("%d",&a);
if(a<min)
min=a;
}
printf("%d\n",min);
}