char, short, int, long, unsigned, signed。
6个关键字可以组合成8种整型类型。
signed char, signed short,
signed int, signed long,
unsigned char, unsigned short,
unsigned int, unsigned long。
一、如何使用char,short,int,long,unsigned,signed
1、signed和unsigned可以与char, short, int, long一起使用。
char,short,int,long默认情况下是signed,带符号位的。
2、signed和unsigned也可以单独使用,这种情况下默认为int类型。
3、在XP 32位系统下,Microsoft Visual Stdio 2005 IDE下,各整型类型的长度是:
sizeof(long) = 4;
sizeof(int) = 4;
sizeof(short) = 2;
sizeof(char) = 1;
4、根据类型所占字节大小,可以分别求出某整型类型的范围。
signed int 32bits(有符号位,二进制补码)
故其范围是: [-2^(31), 2^(31) - 1]
unsigned int 32bits(无符号位)
范围是:[0, 2^(32) - 1]
同理你可以递推出char,short,long的范围。
二、整型转换(1)
将整型类型中分成两组,一组是符号型,另一组是无符号。
如果sizeof(ux) > sizeof(uy),则需要对ux的二进制补码进行左截取,再直接赋值。
如果sizeof(ux) = sizeof(uy),则直接赋值。
如果sizeof(ux) < sizeof(uy),则需要对ux的二进制补码进行左添加0,再直接赋值。
unsigned long ul = 0xFFFFFFF0;
unsigned int ui = 0xFFFFFFF0;
unsigned char uc = 0xF0;
unsigned short us;
us = ul;/*us = 0xFFF0 */
us = ui;/*us = 0xFFF0 */
us = uc;/*us = 0x00F0 */
2、uy = sx
如果sizeof(sx) > sizeof(uy), 则需要对sx的二进制补码进行左截取,再直接赋值。
如果sizeof(sx) = sizeof(uy), 则直接赋值。
如果sizeof(sx) < sizeof(uy), 则需要对sx的二进制补码进行左添加符号位,再直接赋值。
signed long sl = 0xFFFFFFF0;
signed int si = 0xFFFFFFF0;
signed short ss = 0xFFF0;
signed char sc = 0xF0;
unsigned short us;
us = sl; /*us = 0xFFF0*/
us = si; /*us = 0xFFF0*/
us = ss;/*us = 0xFFF0*/
us = sc;/*us = 0xFFF0*/
3、sy = ux
如果sizeof(ux) > sizeof(sy), 则需要对ux的二进制补码进行左截取,再直接赋值。
如果sizeof(ux) = sizeof(sy), 则直接赋值。
如果sizeof(ux) < sizeof(sy), 则需要对ux的二进制补码进行左添加0,再直接赋值。
unsigned long ul = 0xFFFFFFF0;
unsigned int ui = 0xFFFFFFF0;
unsigned short us = 0xFFF0;
unsigned char uc = 0xF0;
signed short ss;
ss = ul; /*ss = 0xFFF0 */
ss = ui; /*ss = 0xFFF0 */
ss = us;/*ss = 0xFFF0 */
ss = uc;/*ss = 0x00F0 */
4、sy = sx
如果sizeof(sx) > sizeof(sy), 则需要对sx的二进制补码进行左截取,再直接赋值。
如果sizeof(sx) = sizeof(sy), 则直接赋值。
如果sizeof(sx) < sizeof(sy), 则需要对sx的二进制补码进行左添加符号位,再直接赋值。
signed long sl = 0xFFFFFFF0;
signed int si = 0xFFFFFFF0;
signed char sc = 0xF0;
signed short ss;
ss = sl; /*ss = 0xFFF0 */
ss = si; /*ss = 0xFFF0*/
ss = sc;/*ss = 0xFFF0*/
二、整型转换(2)
执行赋值操作y_variable = x_variable
1、sizeof(x_variable) > sizeof(y_variable)
对x_variable的二进制补码进行左截取,然后直接赋值。
unsigned int ui = 0xFFFFFFF0;
signed int si = 0xFFFFFFFF0;
unsigned short us;
signed short ss;
us = ui; /*us = 0xFFF0*/
us = si; /*us = 0xFFF0*/
ss = ui; /*ss = 0xFFF0*/
ss = si; /*ss = 0xFFF0*/
2、sizeof(x_variable) = sizeof(y_variable)
直接赋值。
unsigned int ui = 0xFFFFFFF0;
signed int si;
si = ui; /*si = 0xFFFFFFF0*/
3、sizeof(x_variable) < sizeof(y_variable)
对x_variable的二进制补码进行左添加x_variable的符号位,然后直接赋值。
unsigned char uc = 0xF0;
signed char sc = 0xF0;
unsigned short us;
signed short ss;
us = uc;/*us = 0x00F0*/
us = sc;/*us = 0xFFF0*/
ss = uc;/*ss = 0x00F0*/
ss = sc;/*ss = 0xFFF0*/
三、算术类型转换
如果计算表达式中各个变量的类型不同,如何计算该表达式?
1、如果任何一个操作数为long double类型,则将另一个操作数转换为long double类型。
2、否则,如果任何一个操作数为double类型,则将另一个操作数转换为double类型。
3、否则,如果任何一个操作数为float类型,则将另一个操作数转换为float类型。
4、否则,如果任何一个操作数为unsigned long类型,则将另一个操作数转换为unsigned long。
5、否则,如果一个操作数为long类型且另一个操作数为unsigned int类型,则结果依赖于
long类型是否可以表示所有的unsigned int类型的值。如果可以,则将unsigned int 类型的操作数
转换为long类型;如果不可以,则将两个操作数都转换为unsigned long类型。
6、否则,如果一个操作数为long类型,则将另一个操作数转换为long类型。
7、否则,如果一个操作数为unsigned int 类型,则将另一个操作数转换为unsigned int类型。
8、否则,将两个操作数都转换为int类型。
注意1:在规则8中,将两个操作数都转换为int类型。如果操作数中有enum,char,short,则
一律将其转换为int类型,做整型运算。
注意2:在这里不包含强制类型转换。
本人现经营一个微信订阅号如下:欢迎大家关注,获取相关内容。
订阅号账号是:begginghard_zgh
订阅号名称是:读书笔记 By 张光辉