转换为static_cast<无符号字符>

conversion to static_cast<unsigned char>

本文关键字:无符号 字符 gt lt cast 转换 static      更新时间:2023-10-16

转换是否像:

int a[3];
char i=1;
a[ static_cast<unsigned char>(i) ];

引入任何开销,例如转换,或者编译器可以优化所有内容吗?我很感兴趣,因为我想摆脱-Wchar-subscripts警告,但想使用 char 作为索引(其他原因)

我在 Clang 3.4.1 上为此代码做了一个测试:

int ival(signed char c) {
    int a[] = {0,1,2,3,4,5,6,7,8,9};
    unsigned char u = static_cast<unsigned char>(c);
    return a[u];
}

这是使用c++ -S -O3生成的相关零件或装配体文件

_Z4ivala:                               # @_Z4ivala
# BB#0:
    pushl   %ebp
    movl    %esp, %ebp
    movzbl  8(%ebp), %eax
    movl    .L_ZZ4ivalaE1a(,%eax,4), %eax
    popl    %ebp
    ret

没有转换的痕迹。

在大多数现代架构上,charunsigned char具有相同的大小和对齐方式,因此unsigned char可以表示char的所有非负值,并且将一个转换为另一个不需要任何 CPU 指令。