2.1基本内置类型 - C++ primer 笔记
基本内置类型包括算术类型(arithmetic type)和空类型(void)
算术类型
分类
分两类:整型(integral type,int bool char)和浮点型(float double)
尺寸
算术类型的尺寸(即该类型数据所占的比特数b) c++标准规定了尺寸的最小值,同时允许编译器赋予这些类型更大的尺寸。 类型尺寸越大,他所能表示的数据范围越大  用sizeof()获取类型的尺寸,单位是字节byte(1byte=8bit 1B=8b)。
bool a;
char b;
short c;
int d;
long e;
long long f;
float g;
double h;
long double i;
cout << "bool: " << sizeof(a) << endl;
cout << "char: " << sizeof(b) << endl;
cout << "short: " << sizeof(c) << endl;
cout << "int: " << sizeof(d) << endl;
cout << "long: " << sizeof(e) << endl;
cout << "long long: " << sizeof(f) << endl;
cout << "float: " << sizeof(g) << endl;
cout << "double: " << sizeof(h) << endl;
cout <<"long double: "<< sizeof(i) << endl;
bool: 1
char: 1
short: 2
int: 4
long: 4
long long: 8
float: 4
double: 8
long double: 8
bool :true false char的大小与几个机器字节一样
带符号类型和无符号类型
除了布尔型和扩展的字符型,其他整型可以分为带符号signed的和无符号unsigned的两种。signed可以表示正数、负数、0;unsigned只能表示>=0的数。 int、short、long、long long 都是带符号的,前面加上unsigned就可以得到无符号类型。 unsigned int 可以缩写为 unsigned 字符char的表现形式只有两种:带符号和无符号。8bit的unsigned char可以表示0-255(可以用来表示灰度值),signed char可以表示-128 - 127的值。
字节byte 字word
大部分计算机以2的整数次幂(
2
n
2^n
2n)个bit 作为 块 来处理内存 cpu可寻址的最小内存块称为字节,存储的基本单元称为字,字由几个字节组成。 计算机将内存中的每一个字节与一个数字(即地址 address)绑定在一起,当我们要用该字节中存储的内容时,cpu通过它的地址即可找到该内存(寻址),读取内存中存取的八位二进制(假使存的是01010101)。 同时cpu无法寻址更小的单元,比如这个字节的第一位的0,所以说字节是cpu可寻址的最小内存块。 C++中,定义变量时,其实是在操作内存,变量类型表示要申请多大的内存块;给变量赋值时,是将变量的值写到内存中,当然要在代码运行起来的时候,这些操作才生效。
类型转换
基本类型转换
bool b = 42;
int i = b;
i = 3.1;
double pii = i;
unsigned char c = -1;
signed char c2 = 256;
signed char c3 = 255;
signed char c4 = 128;
cout << "sizeof(c):" << sizeof(c) << endl;
cout << "sizeof(c2):" << sizeof(c2) << endl;
sizeof(c):1
sizeof(c2):1
 
发现的问题
 按照书上的说法,有符号与无符号的转换方式是有有差异,但是我发现用vs2015跑代码时,给signed char赋值255是能通过编译的,且也做了取余数的操作。我想应该是VS做了优化的。 换到Ubuntu试试! 环境 Ubuntu 18.04 gcc 7.5 cmake 3.10.0 CMakeLists.txt
# CMake 最低版本号要求
cmake_minimum_required (VERSION 2.8)
# 设置gdb指令
SET(CMAKE_BUILD_TYPE "Debug")
SET(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -O0 -Wall -g2 -ggdb")
SET(CMAKE_CXX_FLAGS_RELEASE "$ENV{CXXFLAGS} -O3 -Wall")
# 项目信息
project (Demo1)
# 指定生成目标
add_executable(Demo main.cpp)
 make的时候,warning,不报错  可执行,正常输出
xrl@DESKTOP-CEH4EAH:~/cppcode/cppprimer/2$ ./Demo
sizeof(c):1
sizeof(c2):1
重新编译
rm CMakeCache.txt
cmake -DCMAKE_BUILD_TYPE=Debug
make
GDB看一下,结果与VS2015的结果基本一致。具体有没有其他影响还不清楚
(gdb) p c
$2 = 255 '\377'
(gdb) p c2
$3 = 0 '\000'
(gdb) p c3
$4 = -1 '\377'
(gdb) p c4
$5 = -128 '\200'
(gdb)
[1]: c++ primer
|