字:字长决定虚拟地址空间大小(0~2w-1),当今大多数计算机字长为64位,根据字长不同的机器,不同数据类型的字节数不同。因此在编译的过程中要考虑可移植性,针对不同位系统。
|
C声明 |
32位机器 |
64位机器 |
|
char |
1 |
1 |
|
short int |
2 |
2 |
|
int |
4 |
4 |
|
long int |
4 |
8 |
|
long long int |
8 |
8 |
|
char * |
4 |
8 |
|
float |
4 |
4 |
|
double |
8 |
8 |
图2・3 C语言中数字数据类型的字节数
声明指针:
表明P是一个指针变量,指向一个类型为T的对象。
T *p;
寻址:
在几乎所有的机器上,多字节对象都被存储为连续的字节序列,对象的地址为所使用字节中最小的地址。
大端:最高位在最低地址

小端:最低位在最低地址

双端法:可选择性配置为大端或者小端
相较于二进制,文本数据(例如ASCII码)具有更好的可移植性
ASCII码适合英文文本
Unicode(32bit)包含范围广
移位运算:
无符号数采用算术移位,大部分编译器对有符号数采取算术移位

确保方式:
1、对于大多数应用程序员来说,他们机器所使用的字节顺序是完全不可见的,网络应用程序的代码编写必须遵守已建立的关于字节顺序的规则,以确保发送方机器将它的内部表示转换成网络标准。
2、阅读字节序列的字节顺序,机器级程序利用反汇编器生成。
![]()
3、字节顺序可见
案例:C语言实现字节顺序可见(应用编程不推荐,程序编程有效)
#include <stdio.h>
typedef unsigned char *byte_pointer;//命名数据类型
void show_bytes(byte_pointer start, int len) {
int i;
for (i = 0; i < len; i++)
printf(“%.2x”, start[i]);
printf(“\n”);
}
void show_int(int x) {
show_bytes((byte.pointer) &x, sizeof(int));
}
void show_float(float x) {
show_bytes((byte_pointer) &x, sizeof(float));
}
void show_pointer(void *x) {
show_bytes((byte_pointer) &x, sizeof(void *));
}
指针被强制类型转换为"unsigned char *,程序把这个指针看成指向一个字节序列,而不是指向一个原始数据类型的对象。然后,这个指针会被看成是对象使用的最低字节地址。
表达式 sizeof (T)返回存储一个类型为7的对象所需要的字节数。使用sizeof,而不是一个固定的值,是向编写在不同机器类型上可移植的代码迈进了一步。
void test_show_bytes(int val) {
int ival = val;
float fval = (float) ival;
int *pval = fval;
show_int(ival);
show_float(fval);
show_pointer(pval);
}
结果:

练习:
int val=0x87654321;
byte_pointer valp=(byte_pointer)&val;
show_bytes (valp,1);/* A."
show_bytes(valp,2);/* B.*/
show_bytes(valp, 3);/* C.*/
指出在小端法机器和大端法机器上,每次调用的输出值。

![]()
0x00459141=0000 0000 0100 0101 1001 0001 0100 0001
0x4A564504=0100 1010 0101 0110 0100 0101 0000 0100
![]()
下面向右移动2位,共21位匹配
![]()
因为浮点数默认最高有效位为1,同时在用浮点数表示时会损失其精度。

本文探讨了C语言中不同类型数据在32位和64位系统中的字节数差异,重点讲解了字符、整型、浮点数和指针的存储情况,并阐述了大端、小端和双端字节顺序的概念。通过实例展示了如何在代码中处理字节顺序问题以实现跨平台可移植性。
592

被折叠的 条评论
为什么被折叠?



