我在编写一个程序试图打印UTF-8字符的组成字节值时遇到了这个问题.

这是我编写的用来测试各种~0个操作的程序:

#include <stdio.h>

int main()
{
    printf("%x\n", (char)~0); // ffffffff
    printf("%x\n", (unsigned char)~0); // ff
    printf("%d\n", sizeof(char) == sizeof(unsigned char)); // 1
    printf("%d\n", sizeof(char) == sizeof(unsigned int)); // 0
    printf("%d\n", (char)~0 == (unsigned int)~0); // 1
}

我很难理解为什么char会产生int大小的值,而unsigned char产生char大小的值.

推荐答案

当将小于int的类型传递给像printf这样的变量函数时,它会将promoted传递给类型int.

在第一种情况下,您传递char的值为-1,其表示形式(假设2的补码)为0xff.它被提升为值为-1、表示为0xffffffff的int,因此这就是打印的内容.

在第二种情况下,您将传递一个值为255的unsigned char,其表示为0xff.它被提升为int,值为255,表示形式为0x000000ff,因此这就是打印的内容(不带前导零).

C++相关问答推荐

为什么listen()(在调用accept()之前)足以让应用程序完成3次握手?

strftime函数中%s的历史意义是什么?为什么没有记录?

va_copy的使用是未定义的行为吗?

Tiva TM4C123GXL的I2C通信

C lang:当我try 将3个或更多元素写入数组时,出现总线错误

C在声明带有值的数组时,声明大小有用吗?

使用scanf在C中读取和存储文件中的值

错误:包含文件时类型名称未知

GDB输出ARM助记符

GTK3按钮信号错误

在Linux上使用vscode和lldb调试用Makefile编译的c代码

将返回的char*设置为S在函数中定义的字符串文字可能会产生什么问题?

如何逐位读取二进制文件?

为什么会出现此错误?二进制表达式的操作数无效

浮动目标文件,数据段

如何在C中处理流水线中的a、n命令?

未使用sem_open正确初始化信号量

我可以使用Windows SDK';s IN6_IS_ADDR_LOOPBACK等,尽管没有文档?

返回指向函数内声明的复合文字的指针是否安全,还是应该使用 malloc?

Codewars Kata 掷骰子的不稳定行为