计算机表示之字的相关概述

66 篇文章 0 订阅
51 篇文章 0 订阅

:字长决定虚拟地址空间大小(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.*/

指出在小端法机器和大端法机器上,每次调用的输出值。

小端法: 21                大端法: 87

小端法:21 43            大端法:87 65

小端法:21 43 65       大端法:87 65 43

 

0x00459141=0000 0000 0100 0101 1001 0001 0100 0001

0x4A564504=0100 1010 0101 0110 0100 0101 0000 0100

下面向右移动2位,共21位匹配

因为浮点数默认最高有效位为1,同时在用浮点数表示时会损失其精度。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值