【问题标题】:Does gcc convert uint8_t to int for single values?gcc 是否将 uint8_t 转换为 int 以获得单个值?
【发布时间】:2014-08-08 06:44:19
【问题描述】:

如果我编译以下程序:

#include <vector>
#include <cstdint>
#include <stdio.h>

int main() {
    constexpr std::size_t N = 10;
    uint8_t int8Value = 42;

    std::vector<int> IntVector(N, 0);
    for (int & ele:IntVector) {
        ele += int8Value;
    }

    std::vector<uint8_t> Int8Vector(N, 0);
    for (uint8_t & ele:Int8Vector) {
        ele += int8Value;
    }

    for (std::size_t i = 0; i < N; i++) {
        printf("%i %i\n",IntVector[i],Int8Vector[i]);
    }
}

gcc 4.9 上使用g++ test.cpp -o test -std=c++11 -Wconversion 它会发出以下警告:

test.cpp: In function ‘int main()’:
test.cpp:16:7: warning: conversion to ‘uint8_t {aka unsigned char}’ from ‘int’ may alter its value [-Wconversion]
ele += int8Value;
   ^

所以如果我理解正确,这意味着编译器将uint_8 的单个值转换为int?这是因为内存对齐吗?

另一方面,如果我尝试类似:

uint8_t int8Value = 342;

它会向我抛出 overflow 警告并转换结果。还有

printf("%i\n",sizeof(int8Value));

返回预期的1

我是否遗漏了一些明显的东西?

【问题讨论】:

    标签: c++ gcc c++11 implicit-conversion type-conversion


    【解决方案1】:

    是的,算术表达式导致转换为int。参见例如this reference.

    【讨论】:

    • 好吧,谢谢。所以+ 就是问题所在。 uint8_t A = 42,B = 23,C = A + B; 行也吐出证实这一点的警告。我应该担心性能方面的问题吗?
    • @magu_ 不用担心,应该在编译时处理。
    • @magu_:通常在机器级别上没有单独的“8位”算术运算 - 编译器将发出代码对“本机”字进行算术运算并根据需要进行屏蔽以获得最低八位。
    猜你喜欢
    • 1970-01-01
    • 2016-03-23
    • 1970-01-01
    • 2017-09-12
    • 2021-08-24
    • 2017-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多