C语言基础(5)-有符号数、无符号数、printf、大小端对齐

1.有符号数和无符号数

有符号数就是最高位为符号位0代表正数,1代表负数

无符号数最高位不是符号位,而就是数的一部分而已。

1011 1111 0000 1111 1111 0000 1011 1010,如果当有符号数看待,那么他是一个负数的补码,如果当一个无符号数看待,他就是一个正数的原码

无符号数最小为0,不可能是负数

定义一个无符号的int

unsigned int a; //使用unsigned int 定义了一个无符号的int变量,名字叫a

short,long,long long, unsigned int

short是短整型,一般shortint的一半大小,short32位的windows下是2个字节

short最大能存放多大的十六进制数?7fff

当一个小的数据类型赋值给一个大的数据类型,不会出错,因为编译器会自动转化,但当一个大的类型赋值给一个小的数据类型,那么就可能丢失高位。

long是长整型,long的大小变化比较多,在32位的windows下是4个字节,在64位的windows4个字节,在32位的linux4个字节,在64位的linux8个字节

long long长长整型,longlong32位系统和64位系统下都是8个字节

unsigned int,unsigned short ,unsigned long, unsigned long long

100默认是int,100L代表long类型的常量,100LL代表long long类型的常量

100u代表unsigned int类型的常量,如果想表达一个unsigned long long 类型的常量,100ull

9l,9L,9ll,9LL,9u,9ull,9ULL

2. printf输出值

%d输出一个有符号的10进制int类型

%o,输出8进制的int

%x,输出16进制的int

%X,输出16进制的int,但abcd这些都用大写字母

%u,输出一个10进制的无符号数

%p 输出内存地址

%u的意思是输出一个unsigned int 类型的数

%lu的意思是输出一个unsigned long 类型的数

%f 的意思是输出float类型的数

%lf是输出double ,long double 类型的浮点数

%c是输出一个char类型的字符

例:以十六进制形式输出一个byte值,带前缀,空位补0:

byte a = 10;

printf("a is: %#04x ", a);

得到的值是:0x0a

# 代表加上十六进制的前缀也就是0x, 04代表输出宽度为4,宽度不足以0补齐。

3. 大端对齐和小端对齐

计算机的内存最小单位是什么?是BYTE,是字节,一个大于BYTE的数据类型在内存中存放的时候要有先后顺序。

高内存地址放整数的高位,低内存地址放整数的低位,这种方式叫到着放,术语叫小端对齐。X86ARM都是小端对齐的。

高内存地址放整数的低位,低内存地址放整数的高位,这种方式叫正着放,术语叫大端对齐,很多unix服务器的CPU是大端对齐的。

定义一个int类型的变量a,在VS下可以看到其在内存中的排列方式如下:

说明windows系统是小端对齐的。

 

原文地址:https://www.cnblogs.com/yongdaimi/p/6230103.html