记录以方便查阅。
1、基本数据类型所占字节长度
32位机器和64位机器字节最大的不同就是long类型和指针类型长度不一样。
2、整型
2.1、32位系统下整型数据的取值范围
数据类型 | 有符号 | 无符号 |
---|---|---|
char | -128 ~ 127 (-2^7 ~ 2^7-1) | 0 ~ 255 (0 ~ 2^8-1) |
short | -32768 ~ 32767 (-2^15 ~ 2^15-1) | 0 ~ 65535 (0 ~ 2^16-1) |
int | -2147483648 ~ 2147483647(-2^31 ~ 2^31 -1) | 0 ~ 4294967295(0 ~ 2^32-1) |
long long | -2^63 ~ 2^63-1 | 0 ~ 2^64-1 |
2.2、整型的二进制表示方式
要搞清楚整型的二进制表示方式,需要搞明白 原码、反码、补码的概念:
原码:用符号位和数值表示带符号数,正数的符号位用“0”表示,负数的符号位用“1”表示,数值部分用二进制形式表示:
比如,int型变量 3、-3的 原码 表示如下:
3(int) | 0000 0000 | 0000 0000 | 0000 0000 | 0000 0011 |
-3(int) | 1000 0000 | 0000 0000 | 0000 0000 | 0000 0011 |
反码:正数的反码与原码相同,负数的反码为对该数的原码除符号位外各位取反。
比如,int型变量 3、-3的 反码 表示如下:
3(int) | 0000 0000 | 0000 0000 | 0000 0000 | 0000 0011 |
-3(int) | 1111 1111 | 1111 1111 | 1111 1111 | 1111 1100 |
补码:正数的补码与原码相同,负数的补码为对该数的原码除符号位外各位取反(即反码),然后在最后一位加1
比如,int型变量 3、-3的 补码 表示如下:
3(int) | 0000 0000 | 0000 0000 | 0000 0000 | 0000 0011 |
-3(int) | 1111 1111 | 1111 1111 | 1111 1111 | 1111 1101 |
在大部分机器中,整型正数是以原码的形式保存在内存中,整型负数是以补码的形式保存在内存中。所以:
整型 | 二进制 | 十六进制 |
---|---|---|
3 | 0000 0000 | 0000 0000 | 0000 0000 | 0000 0011 | 0x00000003 |
-3 | 1111 1111 | 1111 1111 | 1111 1111 | 1111 1101 | 0xFFFFFFFD |
比如,有以下代码:
,
则在内存中px指向的内存为:;py指向的内存为:
因为我用的vs2012是以小端模式存储的,即低位存在低地址,高位存在高地址(比如0x03是低位,且存在了低地址处)。所以实际上表示的就是0x00000003、0xFFFFFFFD(大端模式)。
其中,有几个特殊数值的二进制表示方式:
char 类型 -128 的二进制表示为 1000 0000
short 类型 -32768 的二进制表示为 1000 0000 0000 0000
int 类型的-2147483648的二进制表示为 1000 0000 0000 0000 0000 0000 0000 0000
之所以采用上述方式的原因,可以参考:浅析为什么char类型的范围是 —128~+127_为什么补码的范围是-128到127-CSDN博客
3、浮点型
3.1、float类型在内存中的存储方式
关于float类型在内存中的存储方式可参考文章:int转float时精度损失问题,这篇文章中说明了float类型是如何在内存中存储的,以及解释了为什么int转float类型会出现精度损失的问题。