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);
}