C语言整型转换问题?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言整型转换问题?相关的知识,希望对你有一定的参考价值。
int res = 650;
我想用16进制存在两个char 里
buf[0] = 高位
buf[1] = 低位
有什么快捷的方法么?
可以参考以下代码;
int num = 0x01020304;
char str[4] = 0;
*(int*)str = num;//强制把char指针转换为int指针使用,然后前边加*号赋值。
此时,str[0] = 0x04; str[1] = 0x03;
str[2] = 0x02; str[3] = 0x01;
高地位的顺序你可以看出来了。这种方法可以直接把一个整形按照顺序拆分成4个char型。至于拆分之后你要什么组合,可以自己再处理。
同样,可以用这个方法,把整形拆成short,或者short拆成char
希望对你有用 参考技术B 首先 在 变量的储存的时候是没有几进制这一说的,因为在内存中任何类型的数据都是以2进制来储存的。
buf[0] = (res & 0xff00)>>8;
buf[1] = (char)res;
这样就好了本回答被提问者采纳
C语言中的隐式类型转换
C语言的整型运算至少以缺省整型类型的精度来进行的。
在表达式中,字符和短整型操作数在使用之前被转换为普通整型,这种转换称为整型提升。
整型提升的意义:
表达式的整型运算要在CPU的相应运算器件内执行,CPU内整型运算器(ALU)的操作数的字节长度
一般就是int的字节长度,同时也是CPU的通用寄存器的长度。因此,即使两个char类型的相加,在CPU执行时实际上也要先转换为CPU内整型操作数的标准长度。
通用CPU(general-purpose CPU)是难以直接实现两个8比特字节直接相加运算(虽然机器指令
中可能有这种字节相加指令)。所以,表达式中各种长度可能小于int长度的整型值,都必须先转
换为int或unsigned int,然后才能送入CPU去执行运算。
例如:
char c1 = -1;
c1二进制补码中只有8个bit位,-1的二进制是1111 1111,因为是有符号数,所以在整型提升的过程中,高位补符号位,-1赋值给c1的时候,首先先提升成int型即1111 1111 1111 1111 1111 1111 1111 1111,然后赋值给c1,截断,只保留低八位。
char a = 0xb6;
short b = 0xb600;
int c = 0xb6000000;
if(a==0xb6)
printf("a");
if(b==0xb600)
printf("b");
if(c==0xb6000000)
printf("c");
上面这段代码是整型提升的一个很好的例子
a==0xb6,其中0xb6默认是整形高位为0省略了,实际上是0x000000b6,而a在进行比较的时候发生了整型提升变为0xffffffb6,所以二者不相等。同理b也一样。而c本身是int类型,不需要整型提升,所以最终结果为打印一个字符c。
char c = 1;
printf("%u\\n", sizeof(c));
printf("%u\\n", sizeof(+c));
printf("%u\\n", sizeof(++c));
分别输出1,4,1;c是char类型占用一个字节的大小,+c中的c参与表达式运算,发生整型提升,所以输出的是4,++c只是单独改变c的值,相当于c=c+1;最终还是char类型。
char c = -128;
printf("c=%u",c);
最终输出的结果为4294967168;
原因是-128补码是1000 0000,char类型转换成无符号整型也需要整型提升,最高位补符号位
1111 1111 1111 1111 1111 1111 1000 0000,这个值对应的十进制下的值就是4294967168。
以上是关于C语言整型转换问题?的主要内容,如果未能解决你的问题,请参考以下文章