当我在C和C++开发中使用intlongcharshort等时,我总是知道我已经签署了值.顺便说一句,根据编译器或操作系统的不同,当这些类型的缺省符号变为无符号时会发生什么?我之所以询问,是因为我从来没有在一篇论文或一本书中看到过关于这一点的参考,我也不知道.

推荐答案

类型shortintlonglong long都是带符号的,除非显式限定为unsigned.请注意,shortlong实际上是限定符本身,如果省略,则类型int是隐式的.

类型char是特殊的:它不同于类型signed char,后者显然是带符号的,也不同于类型unsigned char,后者不是.根据平台和编译器设置,类型char可以是有符号的,也可以是无符号的.您可以通过将<limits.h>中定义的宏CHAR_MIN的值与0进行比较,或者将-1转换为(char)并测试它是否保持为负值来测试这一点.

#include <limits.h>
#include <stdio.h>

int main(void) {
    if ((char)-1 < 0) {
        /* most common case */
        printf("char is signed, range is %d..%d\n", CHAR_MIN, CHAR_MAX);
    } else
    if (sizeof(char) == sizeof(int)) {
        /* corner case, for some DSP systems */
        /* char type is the same as unsigned int */
        printf("char is unsigned, range is %u..%u\n", CHAR_MIN, CHAR_MAX);
    } else {
        /* common case, enabled with -funsigned-char for gcc and clang */
        /* char values and constants will promote to int */
        printf("char is unsigned, range is %d..%d\n", CHAR_MIN, CHAR_MAX);
    }
    return 0;
}

请注意,您不能使用上述测试进行预处理,但在<limits.h>中定义的常量可以在预处理器表达式中使用:

#include <limits.h>
#include <stdio.h>

int main(void) {
#if CHAR_MIN < 0
    printf("char is signed, range is %d..%d\n", CHAR_MIN, CHAR_MAX);
#elif CHAR_MAX == UINT_MAX
    printf("char is unsigned, range is %u..%u\n", CHAR_MIN, CHAR_MAX);
#else
    printf("char is unsigned, range is %d..%d\n", CHAR_MIN, CHAR_MAX);
#endif
    return 0;
}

这在C++中也适用,但有一种更惯用的方法来测试它,使用std::is_signed_v<char>.

C++相关问答推荐

两个看似相同的代码的不同行为

如何确保内存分配在地址附近?

Pure Win32 C(++)-除了替换控件的窗口程序之外,还有其他方法可以在输入时禁用按钮吗?

rSP堆栈指针在返回函数调用的值时有任何用途吗?

如何在不修改字符串缓冲区早期使用的情况下覆盖字符串缓冲区

在使用GTK 4 Columnview列表模型时,如何为多列添加排序函数.C编码,Linux/GNOME环境

为什么在C中进行大量的位移位?

为什么在C中二维字符数组会有这样的行为?

ZED for SDL上的C语言服务器

如果dim指定数组中的数据量,使用dim-1会不会潜在地导致丢失一个元素?

将数据移动到寄存器时出现分段故障

整型文字后缀在左移中的用途

如何确保在C程序中将包含uft8字符的字符串正确写入MySQL?

如何读取文件并将内容保存在字符串中?(在C语言中,没有崩溃或核心转储错误)

将变量或参数打包到 struct /联合中是否会带来意想不到的性能损失?

C:Assignment中的链表赋值从指针目标类型中丢弃‘const’限定符

如何在C宏定义中包含双引号?

在C中使用字符串时是否不需要内存分配?

C 语言中 CORDIC 对数的问题

C simd _m128 晶圆厂