- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
下面的程序
#include <inttypes.h> /* printf(" %" PRIu32 "\n"), my_uint32_t) */
#include <stdio.h> /* printf(), perror() */
int main(int argc, char *argv[])
{
uint64_t u64 = ((unsigned char)0x80) << 24;
printf("%" PRIX64 "\n", u64);
/* uint64_t */ u64 = ((unsigned int)0x80) << 24;
printf("%016" PRIX64 "\n", u64);
}
产生
FFFFFFFF80000000
0000000080000000
((unsigned char)0x80)
之间有什么区别?和 ((unsigned int)0x80)
在这种情况下?
我猜 (unsigned char)0x80
晋升为 (unsigned char)0xFFFFFFFFFFFFFF80
然后是移位,但为什么这个转换认为 unsigned char
签到了吗?
同样有趣的是 0x80 << 16
产生预期的结果,0x0000000000800000
.
最佳答案
C 编译器在执行移位之前执行整数提升。
标准的规则 6.3.1.1 说:
If an
int
can represent all values of the original type, the value is converted to anint
; otherwise, it is converted to anunsigned int
. These are called the integer promotions.
因为 unsigned char
的所有值都可以用 int
表示,0x80
被转换为有符号 int
. unsigned int
的情况并非如此:它的一些值不能表示为 int
,因此在应用整数提升后它仍然是 unsigned int
.
关于c - 为什么 ((unsigned char)0x80) << 24 将符号扩展为 0xFFFFFFFF80000000(64 位)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29538935/
我在将 Windows Apache 连接到 SQL Server Express 2008 时遇到问题 PHP 版本 5.2.9 Apache 版本 Apache/2.2.11 (Win32) "d
我在将 Windows Apache 连接到 SQL Server Express 2008 时遇到问题 PHP 版本 5.2.9 Apache 版本 Apache/2.2.11 (Win32) "d
我是一名优秀的程序员,十分优秀!