objective-c - SInt32 和 << 的问题

标签 objective-c int shift

我有这段简单的代码:

char data[4] = { 0x13, 0x34, 0xad, 0xff };
int s = 0;

SInt32 tmp = data[s++]<<24;
printf("tmp= %x\n",tmp);
tmp += (data[s++]<<16);
printf("tmp= %x\n",tmp);
tmp += (data[s++]<<8);
printf("tmp= %x\n",tmp);
tmp += (data[s++]); 
printf("tmp= %x\n",tmp);

我期望的输出是

tmp= 13000000
tmp= 13340000
tmp= 1334ad00
tmp= 1334adff

相反,我得到了

tmp= 13000000
tmp= 13340000
tmp= 1333ad00
tmp= 1333acff

有人可以解释一下为什么吗?

最佳答案

至少在某些运行 Objective-C 的平台上,字符是有符号的。可能它们默认是在 Objective-C 中签名的。

这意味着 0xad 和 0xff 是负数,因为它们有一个负符号位 (MSB)。

因此,您实际上是在倒数第二行添加 -1,而不是添加 255。前面的加法同样涉及负数。

如果将数据更改为“unsigned char”,这种行为应该消失——尽管第一个转变可能会很有趣。

关于objective-c - SInt32 和 << 的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6347884/

相关文章:

ios - 在混合 Swift 和 Obj-C 的项目中使用 Swift Framework 会导致链接器错误

c - 在类型转换繁重的程序中省略小数点

mysql - 如何在 MySQL 数据库中存储电话号码?

c - 如何在不丢失位的情况下执行 c 中的移位?

按住特定键(shift 键)时,Qt keyPressEvent 未正确调用

python - 比较 Pandas DataFrame 中的前一行值

ios - 从 tableView.allowsMultipleSelectionDuringEditing = YES 选择行时如何防止蓝色突出显示

objective-c - 仅使用 NSBundle 插入 Xib 的两个按钮。仍然显示TableView

iphone - 如何在 UITableView 中显示 NSMutableDictionary 数据数组?

c - 为什么二维数组可以从 int ** 转换为 int * ,而指针数组却不能