字:字长决定虚拟地址空间大小(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,同时在用浮点数表示时会损失其精度。