各位大虾,有无unsigned与数据在内存中的存放有关系吗,求解
#include <stdio.h>
int main()
{
int a=0x10000000;
int b,i;
int bits=sizeof(b)*8;
char c;
printf("请输入一个整数:");
scanf("%d",&b);
for(i=1;i<=bits;i++)
{
((b&a))<0?(c='1'):(c='0');
(i<bits)?printf("%c",c):printf("%c\n",c);
}
}
此程序的作用为:
输入个十进制的数,输出其二进制形式,如果输入10,输出为000000000000000000000000001010;
但如果将a定义成unsigned int类型,输出为00000000000000000000000000000000,数据在内存中的存放与有无unsigned应该是不相关的吧?但为什么两次结果不一样呢,纳闷中。。。。。
[解决办法]
((b&a))<0?(c='1'):(c='0');
若b或者a有一个是unsigned,则这里的小于0永远为假,因为会发生cast。
所谓signed和unsigned,其实内存中存的东西没有太大差别,只是符号bit的解释不一样;
然后就是产生的汇编级别的运算不一样,比如这里的小于比较,又比如右移位。
[解决办法]
CMP 比较.(两操作数作减法,仅修改标志位,不回送结果).
JA/JNBE 不小于或不等于时转移.
JAE/JNB 大于或等于转移.
JB/JNAE 小于转移.
JBE/JNA 小于或等于转移.
以上四条,测试无符号整数运算的结果(标志C和Z).
JG/JNLE 大于转移.
JGE/JNL 大于或等于转移.
JL/JNGE 小于转移.
JLE/JNG 小于或等于转移.
以上四条,测试带符号整数运算的结果(标志S,O和Z).
JE/JZ 等于转移.
JNE/JNZ 不等于时转移.
JC 有进位时转移.
JNC 无进位时转移.
JNO 不溢出时转移.
JNP/JPO 奇偶性为奇数时转移.
JNS 符号位为 "0" 时转移.
JO 溢出转移.
JP/JPE 奇偶性为偶数时转移.
JS 符号位为 "1" 时转移.
我认为你的代码无论输入什么进入,输出应该全是0,
你的代码编错了。
((b&a))<0?(c='1'):(c='0');在这句后面要添加一句:b <<= 1;
否则你这个循环就没有任何意义。
多嘴一句,你写这个代码虽然能运行,但是感觉很混乱,编码风格也不好,有待提高啊。
unsigned不会影响数据在内存中的存放
[解决办法]
如楼上所说,如果是unsigned,那么你的代码也会出错,还有你定义的mask值也不应该是
0x10000000应该是0x80000000才对。
((b&a))<0?(c='1'):(c='0');这句要改成
((b & a) == a) ? (c = '1') : (c = '0');